最基础二维线段树 hdu 1823 (简单)
2012-11-03 18:52
435 查看
刚刚看到二维线段树,吓到了,,还以为很难的类。。 刚刚入门的话,其实很简单的啦,之后就不知道了。
其实就是在原来的一维线段树上面再建立一维就ok了。。。 但是我在想的是 现在是因为数据不够大,要是大了怎么办,哎,还没做到那样的题,先不管了
因为每个节点都只用记录最大值。。 仔细看代码吧。。 我已经尽力调到好看了。。。
View Code
其实就是在原来的一维线段树上面再建立一维就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; }
相关文章推荐
- 二维线段树 HDU 1823最简单的入门题
- hdu 1823 Luck and Love (二维线段树)
- HDU1823 Luck and Love (二维线段树 + 单点更新 + 区间查询)
- hdu 1823 Luck and Love ,二维线段树
- http://acm.hdu.edu.cn/showproblem.php?pid=1823 二维线段树
- hdu 1823 Luck and Love(二维线段树)
- HDU 1823 二维线段树
- HDU1823-Luck and Love-二维线段树(模板)
- 【二维线段树】HDU 1823
- HDU1823 Luck and Love(二维线段树单点更新+区间查询+模板)
- hdu1823 二维线段树
- hdu 1823 二维线段树点更新
- [二维线段树](数组实现) HDU 1823 Luck and Love
- 【二维线段树】HDU 1823
- hdu1823 二维线段树~最大值
- hdu -- 1823 Luck and Love(二维线段树)
- hdu-1823 二维线段树
- hdu-1823-Luck and Love-(二维线段树)
- hdu 1823 Luck and Love 二维线段树
- HDU 1823 Luck and Love 二维线段树