您的位置:首页 > 其它

uva11297 二维线段树

2015-07-31 09:50 357 查看
询问矩阵内一块矩阵的最值和单点修改。

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 1000000000
#define pi acos(-1.0)
#define eps 1e-8
#define seed 131
using namespace std;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef long long ll;
const int maxn=100005;
int n,Q;
int Min[2005][2005];
int Max[2005][2005];
int xo,xleaf;
int X1,Y1,X2,Y2,v;
int vmax,vmin;
int a;
void build1D(int l,int r,int rt)
{
    if(l==r) {
        if(xleaf) {
            scanf("%d",&a);
            Max[xo][rt]=Min[xo][rt]=a;
        }
        else {
            Max[xo][rt]=max(Max[xo<<1][rt],Max[xo<<1|1][rt]);
            Min[xo][rt]=min(Min[xo<<1][rt],Min[xo<<1|1][rt]);
        }
        return;
    }
    int m=(l+r)/2;
    build1D(l,m,rt<<1);
    build1D(m+1,r,rt<<1|1);
    Max[xo][rt]=max(Max[xo][rt<<1],Max[xo][rt<<1|1]);
    Min[xo][rt]=min(Min[xo][rt<<1],Min[xo][rt<<1|1]);
}
void build2D(int l,int r,int rt)
{
    if(l==r) {
        xo=rt;
        xleaf=1;
        build1D(1,n,1);
        return;
    }
    int m=(l+r)/2;
    build2D(l,m,rt<<1);
    build2D(m+1,r,rt<<1|1);
    xo=rt;
    xleaf=0;
    build1D(1,n,1);
}
void query1D(int l,int r,int L,int R,int rt)
{
    if(l<=L&&r>=R) {
        vmin=min(vmin,Min[xo][rt]);
        vmax=max(vmax,Max[xo][rt]);
        return;
    }
    int m=(L+R)/2;
    if(l<=m) {
        query1D(l,r,L,m,rt<<1);
    }
    if(r>m) {
        query1D(l,r,m+1,R,rt<<1|1);
    }
}
void query2D(int l,int r,int L,int R,int rt)
{
    if(l<=L&&r>=R) {
        xo=rt;
        query1D(Y1,Y2,1,n,1);
        return;
    }
    int m=(L+R)/2;
    if(l<=m) {
        query2D(l,r,L,m,rt<<1);
    }
    if(r>m) {
        query2D(l,r,m+1,R,rt<<1|1);
    }
}
void update1D(int y,int L,int R,int rt)
{
    if(L==y&&R==y) {
        if(xleaf) {
            Min[xo][rt]=Max[xo][rt]=v;
            return;
        }
        else {
            Min[xo][rt]=min(Min[xo<<1][rt],Min[xo<<1|1][rt]);
            Max[xo][rt]=max(Max[xo<<1][rt],Max[xo<<1|1][rt]);
        }
        return;
    }
    int m=(L+R)/2;
    if(y<=m) {
        update1D(y,L,m,rt<<1);
    }
    else {
        update1D(y,m+1,R,rt<<1|1);
    }
    Min[xo][rt]=min(Min[xo][rt<<1],Min[xo][rt<<1|1]);
    Max[xo][rt]=max(Max[xo][rt<<1],Max[xo][rt<<1|1]);
}
void update2D(int x,int L,int R,int rt)
{
    if(x==L&&x==R) {
        xo=rt;
        xleaf=1;
        update1D(Y1,1,n,1);
        return;
    }
    int m=(L+R)/2;
    if(x<=m) {
        update2D(x,L,m,rt<<1);
    }
    else {
        update2D(x,m+1,R,rt<<1|1);
    }
    xo=rt;
    xleaf=0;
    update1D(Y1,1,n,1);
}
int main()
{
    char op[2];
    scanf("%d",&n);
    build2D(1,n,1);
    scanf("%d",&Q);
    for(int i=0;i<Q;i++) {
        scanf("%s",op);
        if(op[0]=='q') {
            scanf("%d%d%d%d",&X1,&Y1,&X2,&Y2);
            vmax=0;
            vmin=inf;
            query2D(X1,X2,1,n,1);
            printf("%d %d\n",vmax,vmin);
        }
        else {
            scanf("%d%d%d",&X1,&Y1,&v);
            update2D(X1,1,n,1);
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: