Monitor

Monitor

该题的目标对象是一个二维数组

①该题没有给出二维数组的具体范围,而只是给出了\(n*m<=1e7\)

不能够直接定义数组,那么就可以进行动态开辟数组

vector<vector<int> > a(n+5,vector<int>(m+5));

相当于a[n+5][m+5]

②该题对二维数组会进行多次矩形操作,直接暴力操作会导致超时,因而我们可以使用差分来优化

③之后会有多次询问,因而也不能够直接求解矩形内非零个数,因此使用二维前缀和进行预处理

另外要注意的地方:

如果使用cin cout进行读入输出操作的话,记得关同步,不然会超时

而且提交的时候要用G++,用C++也会超时

代码:

// Created by CAD on 2020/1/12.
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    while(cin>>n>>m)
    {
        vector<vector<int> > a(n+5,vector<int>(m+5));
        vector<vector<int> > sum(n+5,vector<int>(m+5));
        int p;cin>>p;
        while(p--)
        {
            int x1,y1,x2,y2;
            cin>>x1>>y1>>x2>>y2;
            a[x1][y1]++,a[x2+1][y2+1]++;
            a[x1][y2+1]--,a[x2+1][y1]--;
        }
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
                a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1],
                        sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+(a[i][j]!=0);
        int q;  cin>>q;
        while(q--)
        {
            int x1,y1,x2,y2;
            cin>>x1>>y1>>x2>>y2;
            int s=(x2-x1+1)*(y2-y1+1);
            if(sum[x2][y2]+sum[x1-1][y1-1]-sum[x1-1][y2]-sum[x2][y1-1]==s) cout<<"YES\n";
            else cout<<"NO\n";
        }
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
头像 会员标识
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
双非坐过牢:非佬,可以啊10.28笔试,11.06评估11.11,11.12两面,11.19oc➕offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务