您的位置:首页 > 其它

HDU 1823 Luck and Love 【二维线段树】

2010-05-28 10:42 417 查看
一道很裸的二维线段树。

题意:操作①:加入一些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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: