题解 :二维前缀和差分(一般都处理矩阵吧)
数据比较大,开二维 vector 动态存
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
int n,m;/* n*m<1E7 */
int main(){
cin>>n>>m;
vector< vector<int> > v(n+2);
vector< vector<int> > sum(n+2);
for(int i=0;i<n+2;i++){
v[i].resize(m+2);//动态开辟数组大小
sum[i].resize(m+2);
}
int q;
cin>>q;
while(q--){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
v[x1][y1]++;
v[x2+1][y2+1]++;
v[x2+1][y1]--;
v[x1][y2+1]--;
}
/*二维差分 */
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
v[i][j]+= v[i-1][j]+ v[i][j-1]- v[i-1][j-1];//对修改的差分数组求前缀和
//cout<<v[i][j]<<" ";
}
// cout<<endl;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(v[i][j]>0){
v[i][j]=1;//注意该题是要求该地能否被监控到 所有1代表这块,面积能监控到
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+v[i][j];//再求想要得到的数组的前缀和
//cout<<sum[i][j]<<" ";
}
//cout<<endl;
}
/* */
int k;
cin>>k;
while(k--){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
int cnt=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];//求任意矩形的面积的
// cout<<cnt<<endl;
int tmp=(x2-x1+1)*(y2-y1+1);
if(cnt==tmp) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}