UVA-11297 Census(线段树套线段树)

题目大意:二维空间点修改,询问矩形区域最值。

题目分析:还是比较简单的。

 

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long
# define mid (l+(r-l)/2)

const int N=500;
const int INF=0x7fffffff;

int maxn[N*4+5][N*4+5];
int minn[N*4+5][N*4+5];

bool leaf;

void pushUpY(int id,int rt)
{
	maxn[id][rt]=max(maxn[id][rt<<1],maxn[id][rt<<1|1]);
	minn[id][rt]=min(minn[id][rt<<1],minn[id][rt<<1|1]);
}

void buildY(int id,int rt,int l,int r)
{
	if(l==r){
		if(leaf){
			int a;
			scanf("%d",&a);
			maxn[id][rt]=minn[id][rt]=a;
		}else{
			maxn[id][rt]=max(maxn[id<<1][rt],maxn[id<<1|1][rt]);
			minn[id][rt]=min(minn[id<<1][rt],minn[id<<1|1][rt]);
		}
	}else{
		buildY(id,rt<<1,l,mid);
		buildY(id,rt<<1|1,mid+1,r);
		pushUpY(id,rt);
	}
}

void buildX(int rt,int l,int r,int m)
{
	if(l==r){
		leaf=true;
		buildY(rt,1,1,m);
	}else{
		buildX(rt<<1,l,mid,m);
		buildX(rt<<1|1,mid+1,r,m);
		leaf=false;
		buildY(rt,1,1,m);
	}
}

void updateY(int id,int rt,int l,int r,int p,int v)
{
	if(l==r){
		if(leaf) maxn[id][rt]=minn[id][rt]=v;
		else{
			maxn[id][rt]=max(maxn[id<<1][rt],maxn[id<<1|1][rt]);
			minn[id][rt]=min(minn[id<<1][rt],minn[id<<1|1][rt]);
		}
	}else{
		if(p<=mid) updateY(id,rt<<1,l,mid,p,v);
		else updateY(id,rt<<1|1,mid+1,r,p,v);
		pushUpY(id,rt);
	}
}

void updateX(int rt,int l,int r,int p1,int p2,int v,int m)
{
	if(l==r){
		leaf=true;
		updateY(rt,1,1,m,p2,v);
	}else{
		if(p1<=mid) updateX(rt<<1,l,mid,p1,p2,v,m);
		else updateX(rt<<1|1,mid+1,r,p1,p2,v,m);
		leaf=false;
		updateY(rt,1,1,m,p2,v);
	}
}

void queryY(int id,int rt,int l,int r,int L,int R,int &mx,int &mn)
{
	if(L<=l&&r<=R){
		mx=max(mx,maxn[id][rt]);
		mn=min(mn,minn[id][rt]);
	}else{
		if(L<=mid) queryY(id,rt<<1,l,mid,L,R,mx,mn);
		if(R>mid) queryY(id,rt<<1|1,mid+1,r,L,R,mx,mn);
	}
}

void queryX(int rt,int l,int r,int L,int R,int L1,int R1,int &mx,int &mn,int m)
{
	if(L<=l&&r<=R){
		queryY(rt,1,1,m,L1,R1,mx,mn);
	}else{
		if(L<=mid) queryX(rt<<1,l,mid,L,R,L1,R1,mx,mn,m);
		if(R>mid) queryX(rt<<1|1,mid+1,r,L,R,L1,R1,mx,mn,m);
	}
}

int main()
{
	int n,q,a,b,c,d;
	char op[2];
	while(~scanf("%d",&n))
	{
		buildX(1,1,n,n);
		scanf("%d",&q);
		while(q--)
		{
			scanf("%s",op);
			if(op[0]=='c'){
				scanf("%d%d%d",&a,&b,&c);
				updateX(1,1,n,a,b,c,n);
			}else if(op[0]=='q'){
				scanf("%d%d%d%d",&a,&b,&c,&d);
				int ansA=-INF,ansB=INF;
				queryX(1,1,n,a,c,b,d,ansA,ansB,n);
				printf("%d %d\n",ansA,ansB);
			}
		}
	}
	return 0;
}

  

posted @ 2016-08-20 08:50  20143605  阅读(368)  评论(0编辑  收藏  举报