【POJ2155】Matrix 二维线段树点修改区间查询

8 篇文章 0 订阅
5 篇文章 0 订阅

//模版题咯。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f1[3205][3205],f2[3205][3205],n,m,x,y,X1,X2,Y1,Y2,a[810][810],xro,maxa,mina,L,t;
bool xflag;
void ins_1D(int ro,int l,int r){
	if (l==r){
		if (xflag) {
			f1[xro][ro]=f2[xro][ro]=a[x][y];
			return ;
		}
		f1[xro][ro]=max(f1[xro*2][ro],f1[xro*2+1][ro]);
		f2[xro][ro]=min(f2[xro*2][ro],f2[xro*2+1][ro]);
		return ;
	}
	int mid=l+((r-l)>>1);
	if (y<=mid) ins_1D(ro*2,l,mid);
	else ins_1D(ro*2+1,mid+1,r);
	f1[xro][ro]=max(f1[xro][ro*2],f1[xro][ro*2+1]);
	f2[xro][ro]=min(f2[xro][ro*2],f2[xro][ro*2+1]);
}
void ins_2D(int ro,int l,int r){
	if (l==r) {
		xro=ro;xflag=1;ins_1D(1,1,n);
	}
	else {
		int mid=l+((r-l)>>1);//为什么用这种写法?不会加爆! 
		if (x<=mid) ins_2D(ro*2,l,mid);
		else ins_2D(ro*2+1,mid+1,r);
		xro=ro;xflag=0;ins_1D(1,1,n);
	}
}
void query_1D(int ro,int l,int r){
	if (Y1<=l&&r<=Y2){
		maxa=max(f1[xro][ro],maxa);
		mina=min(f2[xro][ro],mina);
		return ;
	}
	int mid=l+((r-l)>>1);
	if (mid>=Y1) query_1D(ro*2,l,mid);
	if (mid<Y2) query_1D(ro*2+1,mid+1,r);
}
void query_2D(int ro,int l,int r){
	if (X1<=l&&r<=X2){
		xro=ro;query_1D(1,1,n);
		return ;
	}
	int mid=l+((r-l)>>1);
	if (mid>=X1) query_2D(ro*2,l,mid);
	if (mid<X2) query_2D(ro*2+1,mid+1,r);
}
int main(){
	scanf("%d",&t);
	for (int T=1;T<=t;T++){
		printf("Case #%d:\n",T);
		scanf("%d",&n);
		memset(a,0,sizeof(a));
		for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
		scanf("%d",&a[i][j]);
		memset(f1,0,sizeof(f1));
		memset(f2,0x7f,sizeof(f2));
		for (x=1;x<=n;x++)
		for (y=1;y<=n;y++)
		ins_2D(1,1,n);
		scanf("%d",&m);
		for (int i=1;i<=m;i++){
			scanf("%d%d%d",&x,&y,&L);
			X1=max(x-L/2,1);X2=min(x+L/2,n);
			Y1=max(y-L/2,1);Y2=min(y+L/2,n);
			maxa=0;mina=2147483647;
			query_2D(1,1,n);
			a[x][y]=mina+((maxa-mina)>>1);
			ins_2D(1,1,n);
			printf("%d\n",a[x][y]);
		}
	}
} 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值