传送门
- 二维数组没法开,所以转化为一维数组存储
- 一维操作不方便,写了个getid来映射位置,要处理好边界
- 二维差分,前缀和即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1.0e-8;
const int INF = 0x7fffffff;
const int maxn = 1e7+5;
int mp[maxn];
int n,m,t;
int getid(int i,int j) {
if(i==0||j==0||i>n||j>m)return 0;
return (i-1)*m+j;
}
void add(int i,int j,int val) {
if(getid(i,j)==0) return ;
mp[getid(i,j)]+=val;
}
int main() {
while(~scanf("%d%d",&n,&m)) {
memset(mp,0,sizeof(mp));
int x1,y1,x2,y2;
scanf("%d",&t);
for(int i=0; i<t; i++) {
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
add(x1,y1,1);
add(x2+1,y2+1,1);
add(x1,y2+1,-1);
add(x2+1,y1,-1);
}
for(int i = 1; i<=n; i++) {
for(int j=1; j<=m; j++) {
mp[getid(i,j)] += mp[getid(i-1,j)]+mp[getid(i,j-1)]-mp[getid(i-1,j-1)];
}
}
for(int i = 1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(mp[getid(i,j)] >0) mp[getid(i,j)] = 1;
}
}
for(int i = 1; i<=n; i++) {
for(int j=1; j<=m; j++) {
mp[getid(i,j)] += mp[getid(i-1,j)]+mp[getid(i,j-1)]-mp[getid(i-1,j-1)];
}
}
scanf("%d",&t);
while(t--) {
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(mp[getid(x2,y2)]-mp[getid(x1-1,y2)]-mp[getid(x2,y1-1)]+mp[getid(x1-1,y1-1)]==(x2-x1+1)*(y2-y1+1))
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}