HDU - 6514 Monitor 二维差分

题目链接:点击查看

题意: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值