HDU 1823 Luck and Love 【二维线段树】
2010-05-28 10:42
417 查看
一道很裸的二维线段树。
题意:操作①:加入一些mm的身高(x维),活泼度(y维),缘分值。
操作②:给定一个身高区间,一个活泼值区间,求出该区间内缘分值的最大值。
二维线段树,其实也很简单,整个就是一个“树套树”的结构,一维线段树中每个结点中有一颗子树。
由一维推广到二维,在一维中的的一个值,变成了一颗树。
查询的时候就是先找到对应的身高区间,然后再在活泼度区间查找最大的缘分值。
题意:操作①:加入一些mm的身高(x维),活泼度(y维),缘分值。
操作②:给定一个身高区间,一个活泼值区间,求出该区间内缘分值的最大值。
二维线段树,其实也很简单,整个就是一个“树套树”的结构,一维线段树中每个结点中有一颗子树。
由一维推广到二维,在一维中的的一个值,变成了一颗树。
查询的时候就是先找到对应的身高区间,然后再在活泼度区间查找最大的缘分值。
]// hdu 1823 luck and love 二维线段树 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int MAX=200; struct SUBTREE { int l,r; double dd; }; struct STREE { int l,r; SUBTREE sub[4000]; }ST[4*MAX]; void init(int root,int rt,int ll,int rr) { ST[root].sub[rt].l=ll; ST[root].sub[rt].r=rr; ST[root].sub[rt].dd=-1; if(ll==rr) return ; int mid=(ll+rr)/2; init(root,2*rt,ll,mid); init(root,2*rt+1,mid+1,rr); } void Build(int root,int left,int right,int ll,int rr) { ST[root].l=left; ST[root].r=right; init(root,1,ll,rr); if(left==right) return ; int mid=(left+right)/2; Build(2*root,left,mid,ll,rr); Build(2*root+1,mid+1,right,ll,rr); } void add(int root,int rt,int sd,double val) { ST[root].sub[rt].dd=max(val,ST[root].sub[rt].dd); if(ST[root].sub[rt].l==ST[root].sub[rt].r) { return ; } int mid=(ST[root].sub[rt].l+ST[root].sub[rt].r)/2; if(sd<=mid) add(root,2*rt,sd,val); else add(root,2*rt+1,sd,val); ST[root].sub[rt].dd=max(ST[root].sub[2*rt].dd,ST[root].sub[2*rt+1].dd); } void Insert(int root,int d,int sd,double val) { add(root,1,sd,val); if(ST[root].l==ST[root].r) { return ; } if(d<=ST[2*root].r) Insert(2*root,d,sd,val); else Insert(2*root+1,d,sd,val); // up(root,1); } double ser(int root,int rt,int ll,int rr) { if(ST[root].sub[rt].l==ll&&ST[root].sub[rt].r==rr) { return ST[root].sub[rt].dd; } int mid=(ST[root].sub[rt].l+ST[root].sub[rt].r)/2; if(rr<=mid) return ser(root,2*rt,ll,rr); else if(ll>mid) return ser(root,2*rt+1,ll,rr); else { double aa=ser(root,2*rt,ll,mid); double bb=ser(root,2*rt+1,mid+1,rr); return aa>bb?aa:bb; } } double Find(int root,int left,int right,int ll,int rr) { if(ST[root].l==left&&ST[root].r==right) { double tmp=ser(root,1,ll,rr); return tmp; } int mid=(ST[root].l+ST[root].r)/2; if(right<=mid) return Find(2*root,left,right,ll,rr); else if(left>mid) return Find(2*root+1,left,right,ll,rr); else { double aa=Find(2*root,left,mid,ll,rr); double bb=Find(2*root+1,mid+1,right,ll,rr); return aa>bb?aa:bb; } } int M; int main() { int high,act; char ch[10]; double tt,love; while(scanf("%d",&M)&&M) { Build(1,100,200,0,1000); while(M--) { scanf("%s",ch); if(ch[0]=='I') { scanf("%d%lf%lf",&high,&tt,&love); act=(int)(tt*10); Insert(1,high,act,love); } else { int lh,rh; double la,ra; scanf("%d%d%lf%lf",&lh,&rh,&la,&ra); if(lh>rh) lh^=rh^=lh^=rh; if(la>ra) {double tmp=la;la=ra;ra=tmp;} double ans=Find(1,lh,rh,(int)(la*10),(int)(ra*10)); if(ans==-1) puts("-1"); else printf("%.1lf/n",ans); } } } system("pause"); return 0; }
相关文章推荐
- HDU-1823 Luck and Love 二维线段树
- HDU 1823 Luck and Love 二维线段树
- hdu 1823 Luck and Love 二维线段树
- HDU 1823 Luck and Love(二维线段树)
- HDU1823 Luck and Love, 二维线段树
- HDU1823 Luck and Love(二维线段树单点更新+区间查询+模板)
- hdu 1823 Luck and Love 【二维线段树】
- hdu 1823 Luck and Love ,二维线段树
- hdu 1823 Luck and Love 二维线段树
- HDU 1823 Luck and Love 二维线段树
- HDU 1823 Luck and Love (二维线段树模板)
- hdu -- 1823 Luck and Love(二维线段树)
- hdu 1823 Luck and Love (二维线段树)
- HDU 1823 Luck and Love(二维线段树)
- 树套树:二维线段树初步:hdu1823——Luck and Love(单点修改,区间查询)
- HDU - 1823 Luck and Love(二维线段树、单点更新区间最值)
- hdu-1823-Luck and Love-(二维线段树)
- hdu 1823 Luck and Love(二维线段树)
- HDU1823 Luck and Love (二维线段树 + 单点更新 + 区间查询)
- HDU-1823-Luck and Love-二维线段树入门