之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上。
二维线段树 -- 点更段查
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int N,M; double ma[110<<2][1010<<2]; void pushUpY(int xu,int u){ ma[xu][u]=max(ma[xu][u<<1], ma[xu][u<<1|1]); } void pushUpX(int xu,int u){ ma[xu][u]=max(ma[xu<<1][u], ma[xu<<1|1][u]); } void updateY(int xu,int xl,int xr,int u,int l,int r,int x,int y,double val){ if(l==r){ ma[xu][u] = max(ma[xu][u], val); if(xl<xr) pushUpX(xu,u); return ; } int mid = (l+r)>>1; if(y<=mid) updateY(xu,xl,xr,u<<1,l,mid,x,y,val); else updateY(xu,xl,xr,u<<1|1,mid+1,r,x,y,val); pushUpY(xu,u); } void updateX(int u,int l,int r,int x,int y,double val){ if(l==r){ updateY(u,l,r,1,1,M,x,y,val); return ; } int mid = (l+r)>>1; if(x<=mid) updateX(u<<1,l,mid,x,y,val); else updateX(u<<1|1,mid+1,r,x,y,val); updateY(u,l,r,1,1,M,x,y,val); } double queryY(int xu,int u,int l,int r,int y1,int y2){ if(l==y1 && r==y2) return ma[xu][u]; int mid = (l+r)>>1; if(y2<=mid) return queryY(xu,u<<1,l,mid,y1,y2); else if(y1>mid) return queryY(xu,u<<1|1,mid+1,r,y1,y2); else return max(queryY(xu,u<<1,l,mid,y1,mid), queryY(xu,u<<1|1,mid+1,r,mid+1,y2)); } double queryX(int u,int l,int r,int x1,int x2,int y1,int y2){ if(l==x1 && r==x2) return queryY(u,1,1,M,y1,y2); int mid = (l+r)>>1; if(x2<=mid) return queryX(u<<1,l,mid,x1,x2,y1,y2); else if(x1>mid) return queryX(u<<1|1,mid+1,r,x1,x2,y1,y2); else return max(queryX(u<<1,l,mid,x1,mid,y1,y2), queryX(u<<1|1,mid+1,r,mid+1,x2,y1,y2)); } void buildY(int xu,int u,int l,int r){ ma[xu][u]=-1.; if(l==r) return ; int mid = (l+r)>>1; buildY(xu,u<<1,l,mid); buildY(xu,u<<1|1,mid+1,r); } void buildX(int u,int l,int r){ if(l==r){buildY(u,1,1,M);return ;} int mid = (l+r)>>1; buildX(u<<1,l,mid); buildX(u<<1|1,mid+1,r); buildY(u,1,1,M); } int main(){ int m; while(~scanf("%d",&m) && m){ N=101,M=1001; buildX(1,1,N); char op[3]; for(int i=0;i<m;++i){ scanf("%s",op); if(op[0]=='I'){ int h;double a,l; scanf("%d%lf%lf",&h,&a,&l); updateX(1,1,N,h-99,int(a*10)+1,l); } else { int h1,h2;double a1,a2; scanf("%d%d%lf%lf",&h1,&h2,&a1,&a2); if(h1>h2) swap(h1,h2); if(a1>a2) swap(a1,a2); double ans = queryX(1,1,N,h1-99,h2-99,int(a1*10)+1,int(a2*10)+1); if(ans<0) puts("-1"); else printf("%.1lf ",ans); } } } return 0; }