欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}