二维线段树求助
  • 板块UVA11297 Census
  • 楼主itisover
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/6/30 14:46
  • 上次更新2023/11/4 21:09:25
查看原帖
二维线段树求助
186045
itisover楼主2021/6/30 14:46

第一次尝试不用二维数组的二维线段树,自己yy的代码

#include<bits/stdc++.h>
using namespace std;
const int N=505,INF=2e9;
struct QK{
    int ma,mi;
};
int n;
int a[N][N];
void merge(QK &x,QK l,QK r){
    x.ma=max(l.ma,r.ma);
    x.mi=min(l.mi,r.mi);
}
struct segmenttree{
#define ls x<<1
#define rs x<<1|1
    QK s[N<<2];
    void build(int x,int l,int r){
	s[x].mi=INF;
	s[x].ma=-INF;
	if(l==r){
	    cin>>s[x].mi;
	    s[x].ma=s[x].mi;
	    return;
	}
	int mid=l+r>>1;
	build(ls,l,mid);build(rs,mid+1,r);
	merge(s[x],s[ls],s[rs]);
    }
    void upd(int x,int l,int r,int p,int v){
	if(l==r){
	    s[x].ma=s[x].mi=v;
	    return;
	}
	int mid=l+r>>1;
	if(p<=mid) upd(ls,l,mid,p,v);
	else upd(rs,mid+1,r,p,v);
	merge(s[x],s[ls],s[rs]);
    }
    QK query(int x,int l,int r,int xl,int xr){
	if(xl<=l&&xr>=r){
	    return s[x];
	}
	int mid=l+r>>1;
	QK res;
	res.mi=INF;
	if(xl<=mid) res=query(ls,l,mid,xl,xr);
	if(xr>mid){
	    QK tmp=query(rs,mid+1,r,xl,xr);
	    merge(res,res,tmp);
	}
	return res;
    }
}s[N<<2];
void pushup(segmenttree &o,segmenttree &lc,segmenttree &rc,int x,int l,int r){
    merge(o.s[x],lc.s[x],rc.s[x]);
    if(l==r) return;
    int mid=l+r>>1;
    pushup(o,lc,rc,ls,l,mid);pushup(o,lc,rc,rs,mid+1,r);
}
void build(int x,int l,int r){
    if(l==r){
	s[x].build(1,1,n);
	return;
    }
    int mid=l+r>>1;
    build(ls,l,mid);build(rs,mid+1,r);
    pushup(s[x],s[ls],s[rs],1,1,n);
}
void upd(int x,int l,int r,int xxx,int yyy,int v){
    if(l==r){
	s[x].upd(1,1,n,yyy,v);
	return;
    }
    int mid=l+r>>1;
    if(mid>=xxx) upd(ls,l,mid,xxx,yyy,v);
    else upd(rs,mid+1,r,xxx,yyy,v);
    pushup(s[x],s[ls],s[rs],1,1,n);
}
QK query(int x,int l,int r,int xxx,int yyy,int xx,int yy){
    if(xxx<=l&&xx>=r){
	return s[x].query(1,1,n,yyy,yy);
    }
    int mid=l+r>>1;
    QK res;
    res.mi=INF;res.ma=-INF;
    if(xxx<=mid) res=query(ls,l,mid,xxx,yyy,xx,yy);
    if(xx>mid){
	QK tmp=query(rs,mid+1,r,xxx,yyy,xx,yy);
	merge(res,res,tmp);
    }
    return res;
}
int Q;
int main(){
    cin>>n;
    build(1,1,n);
    cin>>Q;
    while(Q--){
	char ch;
	int xxx,yyy,x2,y2,v;
	cin>>ch>>xxx>>yyy;
	if(ch=='q'){
	    cin>>x2>>y2;
	    QK ans=query(1,1,n,xxx,yyy,x2,y2);
	    cout<<ans.ma<<" "<<ans.mi<<endl;
	}
	else{
	    cin>>v;
	    upd(1,1,n,xxx,yyy,v);
	}
    }
    return 0;
}
2021/6/30 14:46
加载中...