【二維線段樹】HDU 1823

來源:互聯網
上載者:User

 很裸的一道二維線段樹,第一次做,其實二維的線段樹也就是樹套樹,先一維再第二維,第一、二維的操作都很類似。

說回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;}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.