很裸的一道二維線段樹,第一次做,其實二維的線段樹也就是樹套樹,先一維再第二維,第一、二維的操作都很類似。
說回hdu這道題,有點水,提交的時候記得交c++,g++會wa死你!
#define N 210struct node{ int al,ar; double mx;};struct node1{ int hl,hr; node subt[4000];}t[N*4];void build_sub(int id,int rt,int ll,int rr){//第二維建樹 t[id].subt[rt].al = ll; t[id].subt[rt].ar = rr; t[id].subt[rt].mx = -1.0; if(ll == rr){ return ; } int mid = (ll+rr)>>1; build_sub(id,rt<<1,ll,mid); build_sub(id,rt<<1|1,mid+1,rr);}void build(int id,int l,int r,int ll,int rr){//一維建樹 t[id].hl = l; t[id].hr = r; build_sub(id,1,ll,rr); if(l == r)return ; int mid = (l+r)>>1; build(id<<1,l,mid,ll,rr); build(id<<1|1,mid+1,r,ll,rr);}void add_sub(int id,int rt,int act,double love){//第二維插入 t[id].subt[rt].mx = max(love,t[id].subt[rt].mx); if(t[id].subt[rt].al == t[id].subt[rt].ar)return ; int mid = (t[id].subt[rt].al+t[id].subt[rt].ar)>>1; if(act<=mid)add_sub(id,rt<<1,act,love); else add_sub(id,rt<<1|1,act,love); t[id].subt[rt].mx = max(t[id].subt[rt<<1].mx, t[id].subt[rt<<1|1].mx);}void add(int id,int h,int act,double love){//第一位插入 add_sub(id,1,act,love); if(t[id].hl == t[id].hr){ return ; } int mid = (t[id].hl+t[id].hr)>>1; if(h<=mid)add(id<<1,h,act,love); else add(id<<1|1,h,act,love);}double sear(int id,int rt,int ll,int rr){//尋找第二維 if(t[id].subt[rt].al==ll && t[id].subt[rt].ar==rr){ return t[id].subt[rt].mx; } int mid = (t[id].subt[rt].al+t[id].subt[rt].ar)>>1; if(rr<=mid)return sear(id,rt<<1,ll,rr); else if(ll>mid)return sear(id,rt<<1|1,ll,rr); else return max(sear(id,rt<<1,ll,mid), sear(id,rt<<1|1,mid+1,rr));}double query(int id,int l,int r,int ll,int rr){//尋找第二維 if(t[id].hl==l && t[id].hr==r){ return sear(id,1,ll,rr); } int mid = (t[id].hl+t[id].hr)>>1; if(r<=mid)return query(id<<1,l,r,ll,rr); else if(l>mid)return query(id<<1|1,l,r,ll,rr); else return max(query(id<<1,l,mid,ll,rr), query(id<<1|1,mid+1,r,ll,rr));}int main(){ int n; while(scanf("%d",&n) && n){ int i,j; build(1,100,200,0,1000); char str[3]; while(n--){ scanf("%s",str); if(str[0] == 'I'){ double x,y; int h; scanf("%d%lf%lf",&h,&x,&y); int xx = x*10; add(1,h,xx,y); } else { int h1,h2; double x1,x2; int y1,y2; scanf("%d%d%lf%lf",&h1,&h2,&x1,&x2); y1 = x1*10,y2 = x2*10; if(h1>h2)swap(h1,h2);//trick! if(y1>y2)swap(y1,y2); double ans = query(1,h1,h2,y1,y2); if(ans == -1.0)printf("-1\n"); else printf("%.1lf\n",ans); } } } return 0;}