• UVA11297 Census


    题目

    UVA11297 Census

    做法

    二维线段树,单点修改,矩阵查询,树套树((x,y)),维护最大值最小值废话

    有一点要注意的是:(x)树传到(y)树里面修改的时候,如果(x)树中是叶子节点之间修改,否则在y树中还得拿(x)树中的左右儿子来修改

    My complete code

    #include<bits/stdc++.h>
    using namespace std;
    typedef int LL;
    const LL inf=0x3f3f3f3f,maxn=2009;
    LL n,xo,tmx,tmi,q;
    LL Mx[maxn][maxn],Mi[maxn][maxn];
    bool leaf;
    void Modify1(LL now,LL l,LL r,LL c,LL val){
    	if(l==r){
    		if(leaf){
    			Mx[xo][now]=Mi[xo][now]=val; return;
    		}
    		Mx[xo][now]=max(Mx[xo<<1][now],Mx[xo<<1|1][now]),
    		Mi[xo][now]=min(Mi[xo<<1][now],Mi[xo<<1|1][now]);
    		return;
    	}
    	LL mid(l+r>>1);
    	if(c<=mid) Modify1(now<<1,l,mid,c,val);
    	else Modify1(now<<1|1,mid+1,r,c,val);
    	Mx[xo][now]=max(Mx[xo][now<<1],Mx[xo][now<<1|1]),
    	Mi[xo][now]=min(Mi[xo][now<<1],Mi[xo][now<<1|1]);
    }
    void Modify2(LL now,LL l,LL r,LL x,LL y,LL val){
    	if(l==r){
    		xo=now,leaf=true; Modify1(1,1,n,y,val);
    		return;
    	}
    	LL mid(l+r>>1);
    	if(x<=mid) Modify2(now<<1,l,mid,x,y,val);
    	else Modify2(now<<1|1,mid+1,r,x,y,val);
    	xo=now,leaf=false; Modify1(1,1,n,y,val);
    }
    void Query1(LL now,LL l,LL r,LL y1,LL y2){
    	if(y1<=l&&y2>=r){
    		tmx=max(tmx,Mx[xo][now]),tmi=min(tmi,Mi[xo][now]);
    		return;
    	}
    	LL mid(l+r>>1);
    	if(y1<=mid) Query1(now<<1,l,mid,y1,y2);
    	if(y2>mid) Query1(now<<1|1,mid+1,r,y1,y2);
    }
    void Query2(LL now,LL l,LL r,LL x1,LL x2,LL y1,LL y2){
    	if(x1<=l&&x2>=r){
    		xo=now,Query1(1,1,n,y1,y2);
    		return;
    	}
    	LL mid(l+r>>1);
    	if(x1<=mid) Query2(now<<1,l,mid,x1,x2,y1,y2);
    	if(x2>mid) Query2(now<<1|1,mid+1,r,x1,x2,y1,y2);
    }
    int main(){
    	cin>>n;
    	for(LL i=1;i<=n;++i)
    	    for(LL j=1;j<=n;++j){
    	    	LL val;
    	    	cin>>val;
    	    	Modify2(1,1,n,i,j,val);
    		}
    	cin>>q;
    	while(q--){
    		char c;scanf(" %c ",&c);
    		if(c=='q'){
    			LL x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2;
    			tmx=-inf,tmi=inf;
    			Query2(1,1,n,x1,x2,y1,y2);
    			cout<<tmx<<' '<<tmi<<endl;
    		}else{
    			LL x,y,val; cin>>x>>y>>val;
    			Modify2(1,1,n,x,y,val);
    		}
    	}return 0;
    }
    
  • 相关阅读:
    实例教学在MySQL中若何导出整个数据库
    在Linux下Turbomail简易快捷的装置方式
    Fedora下编译mitscheme
    Fedora 9可以不敌RedHat 9光辉
    实用伎俩:Ubuntu Linux 8.04设置与优化
    Linux下给WordPress建设伪静态
    红旗桌面版本最新使用要领和题目问题解答100例5
    知识管理系统红旗Linux/KM.Center
    python 虚拟环境的安装
    python 闭包
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10348758.html
Copyright © 2020-2023  润新知