题目链接<http://acm.hdu.edu.cn/showproblem.php?pid=6514>
题意:
一张n*m(n*m<=1e7)的矩形,被若干个矩形覆盖,另外问一些矩形是否被前者包含。
题解:
对于覆盖的矩形,在对角线点分别取1和-1,做一个前缀和。
此时被多个矩形覆盖的可能会大于1,暴力扫一遍把这些全赋值成1。
再做一遍前缀和,通过计算面积来判断是否被包含。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e7+7;
int dp[N];
int n,m,q;
int get(int x,int y){
return x*m+y;
}
int main(){
int x,y,xx,yy;
while(scanf("%d%d",&n,&m)!=EOF){
scanf("%d",&q);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[get(i,j)]=0;
while(q--){
scanf("%d%d%d%d",&x,&y,&xx,&yy);
dp[get(x,y)]++;
dp[get(xx+1,y)]--;
dp[get(x,yy+1)]--;
dp[get(xx+1,yy+1)]++;
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[get(i,j)]+=dp[get(i-1,j)]+dp[get(i,j-1)]-dp[get(i-1,j-1)];
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(dp[get(i,j)]) dp[get(i,j)]=1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[get(i,j)]+=dp[get(i-1,j)]+dp[get(i,j-1)]-dp[get(i-1,j-1)];
scanf("%d",&q);
while(q--){
scanf("%d%d%d%d",&x,&y,&xx,&yy);
int tmp=(xx-x+1)*(yy-y+1);
int tt=dp[get(xx,yy)]-dp[get(xx,y-1)]-dp[get(x-1,yy)]+dp[get(x-1,y-1)];
if(tmp==tt) printf("YES\n");
else printf("NO\n");
}
}
}