UVA11297 Census

Posted y2823774827y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于UVA11297 Census的主要内容,如果未能解决你的问题,请参考以下文章

UVa 11297 Census (二维线段树)

码上实战立体匹配系列经典AD-Census: 框架

理论恒叨立体匹配系列经典AD-Census: 代价计算

码上实战立体匹配系列经典AD-Census: 多步骤视差优化

理论恒叨立体匹配系列经典AD-Census: 多步骤视差优化

理论恒叨立体匹配系列经典AD-Census: 扫描线优化(Scanline Optimization)