HDU Monitor(二维差分前缀和)

题解 :二维前缀和差分(一般都处理矩阵吧)

        数据比较大,开二维 vector 动态存

#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
int n,m;/* n*m<1E7  */
int main(){
	cin>>n>>m;
	vector< vector<int> > v(n+2);
	vector< vector<int> > sum(n+2);
	for(int i=0;i<n+2;i++){
		v[i].resize(m+2);//动态开辟数组大小 
		sum[i].resize(m+2);
	}
	int q;
	cin>>q;
	while(q--){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		v[x1][y1]++;
		v[x2+1][y2+1]++;
		v[x2+1][y1]--;
		v[x1][y2+1]--;
	}
	/*二维差分 */
	for(int i=1;i<=n;i++){ 
		for(int j=1;j<=m;j++){
			v[i][j]+= v[i-1][j]+ v[i][j-1]- v[i-1][j-1];//对修改的差分数组求前缀和 
			//cout<<v[i][j]<<" ";
		}
	//	cout<<endl;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(v[i][j]>0){
				v[i][j]=1;//注意该题是要求该地能否被监控到 所有1代表这块,面积能监控到 
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+v[i][j];//再求想要得到的数组的前缀和 
			//cout<<sum[i][j]<<" ";
		}
		//cout<<endl;
	} 
	/*         */
	int k;
	cin>>k;
	while(k--){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2; 
		int cnt=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];//求任意矩形的面积的 
	//	cout<<cnt<<endl; 
		int tmp=(x2-x1+1)*(y2-y1+1);
		if(cnt==tmp)  cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/gml1999/article/details/89414213
今日推荐