您的位置:首页 > 其它

最基础二维线段树 hdu 1823 (简单)

2012-11-03 18:52 435 查看
刚刚看到二维线段树,吓到了,,还以为很难的类。。 刚刚入门的话,其实很简单的啦,之后就不知道了。

其实就是在原来的一维线段树上面再建立一维就ok了。。。 但是我在想的是 现在是因为数据不够大,要是大了怎么办,哎,还没做到那样的题,先不管了

因为每个节点都只用记录最大值。。 仔细看代码吧。。 我已经尽力调到好看了。。。

View Code

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using std::swap;
const int N = 111;

const int M = 1111;
struct parent
{
double son[M<<2];
} tre[N<<2];
double Max(double a,double b)
{
return a>b?a:b;
}
int ll,rr;
void update_s(int s,int t,int l,int r,int L,double val)
{
if(l==r)
{
tre[s].son[t]=Max(val,tre[s].son[t]);
return ;
}
int m=(l+r)>>1;
if(L<=m)update_s(s,t<<1,l,m,L,val);
else update_s(s,t<<1|1,m+1,r,L,val);
tre[s].son[t]=Max(tre[s].son[t<<1],tre[s].son[t<<1|1]);
}
void update_p(int t,int u,int l,int r,double val)
{
update_s(t,1,0,1000,ll,val);
if(l==r)
{
update_s(t,1,0,1000,ll,val);
return ;
}
int m=(r+l)>>1;
if(u<=m)update_p(t<<1,u,l,m,val);
else update_p(t<<1|1,u,m+1,r,val);
}
double query_s(int s,int t,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
return tre[s].son[t];
}
int m=(r+l)>>1;
double ans=(-1)*1.0;
if(L<=m)ans=Max(ans,query_s(s,t<<1,l,m,L,R));
if(R>m)ans=Max(ans,query_s(s,t<<1|1,m+1,r,L,R));
return ans;
}
double query_p(int t,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
return query_s(t,1,0,1000,ll,rr);
}
int m=(l+r)>>1;
double ans=(-1)*1.0;
if(L<=m)ans=Max(ans,query_p(t<<1,l,m,L,R));
if(R>m)ans=Max(ans,query_p(t<<1|1,m+1,r,L,R));
return ans;
}
void build_s(int s,int t,int l,int r)
{
tre[s].son[t]=(-1)*1.0;
if(l==r)
{
tre[s].son[t]=(-1)*1.0;
return ;
}
int m=(l+r)>>1;
build_s(s,t<<1,l,m);
build_s(s,t<<1|1,m+1,r);
}
void build_p(int t,int l,int r)
{
build_s(t,1,0,1000);
if(l==r)
{
build_s(t,1,0,1000);
return ;
}
int m=(l+r)>>1;
build_p(t<<1,l,m);
build_p(t<<1|1,m+1,r);
}
int main()
{
int n;
int H1,H2;
double A1,A2,val;
char temp[5];
while(scanf("%d",&n)&&n)
{
build_p(1,100,200);
for(int i=0; i<n; i++)
{
scanf("%s",temp);
if(temp[0]=='I')
{
scanf("%d",&H1);
scanf("%lf%lf",&A1,&val);
ll=int(A1*10);
update_p(1,H1,100,200,val);
}
else
{
scanf("%d%d",&H1,&H2);
if(H1>H2)swap(H1,H2);
scanf("%lf%lf",&A1,&A2);
ll=int(A1*10);
rr=int(A2*10);
if(ll>rr)swap(ll,rr);
double ans=query_p(1,100,200,H1,H2);
if(ans<0.0)printf("-1\n");
else
printf("%.1lf\n",query_p(1,100,200,H1,H2));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: