HDU - 6514 Monitor 二维差分
程序员文章站
2022-07-12 17:38:32
...
题目链接:点击查看
题意:n*m的矩阵,给出p个监控器的监控矩阵范围,q次询问,给出一矩阵,问是否全部都能被监控到
题解:二维差分搞一下即可,但我用vector超内存了,所以hash一下即可 但要注意,对于(i,j),若两点为(i,m)和(i+1,0) i*m+m == (i+1)*m+0 我刚开始直接这样哈希了,打标才发现这样不emm 所以,i坐标乘(m+1)就行了
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int v[N*4];
int n,m,p,q;
int main()
{
int x1,x2,y1,y2;
int i,j;
while(~scanf("%d%d",&n,&m))
{
int mm=m+1;
for(i=0;i<=(n+1)*mm;i++)v[i]=0;
scanf("%d",&p);
for(i=1;i<=p;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
v[x1*mm+y1]++;
if(y2+1<=m)v[x1*mm+y2+1]--;
if(x2+1<=n)v[(x2+1)*mm+y1]--;
if(x2+1<=n&&y2+1<=m)v[(x2+1)*mm+y2+1]++;
}
for(i=1;i<=n;i++)
for(j=0;j<=m;j++)
v[i*mm+j]+=v[(i-1)*mm+j];
for(i=0;i<=n;i++)
for(j=1;j<=m;j++)
v[i*mm+j]+=v[i*mm+j-1];
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
v[i*mm+j]=v[i*mm+j]>0;
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
{
if(i-1>=0) v[i*mm+j]+=v[(i-1)*mm+j];
if(j-1>=0) v[i*mm+j]+=v[i*mm+j-1];
if(i-1>=0&&j-1>=0) v[i*mm+j]-=v[(i-1)*mm+j-1];
// printf("%d%c",v[i*mm+j]," \n"[j==m]);
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
// cout<<v[x2*mm+y2]<<" "<<v[x2*mm+y1-1]<<" "<<v[(x1-1)*mm+y2]<<" "<<v[(x1-1)*mm+y1-1]<<endl;
if(v[x2*mm+y2]-v[x2*mm+y1-1]-v[(x1-1)*mm+y2]+v[(x1-1)*mm+y1-1]==(x2-x1+1)*(y2-y1+1)) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}