这个题是一个理解二维线段树的好题,其实二维线段树不难 先建立一颗线段树,然后每个节点下又有一个线段树,看看代码很容易理解的,以前总不想去看 先查找身高符合要求的,然后再查找活泼值符合要求中缘分值最大的 代码很简单,只是比普通的线段树多了点 /* * File: main.cpp * Author: Mi * * Created on 2011年3月30日, 下午12:59 */ #include <cstdlib> #include <stdio.h> #include <algorithm> #define N 1005 using namespace std; /* * */ double max(double a,double b) {return a>b?a:b;} struct tree_y { int l,r; double max; int mid() { return (l+r)>>1; } }; struct tree_x { int l,r; tree_y Y[N*4]; int mid() { return (l+r)>>1; } }X[405]; void build_y(tree_x &x,int l,int r,int root) { x.Y[root].l=l; x.Y[root].r=r; x.Y[root].max=-1; if(l==r) return ; int mid=x.Y[root].mid(); build_y(x,l,mid,root<<1); build_y(x,mid+1,r,root<<1|1); } void build_x(int l,int r,int root) { X[root].l=l,X[root].r=r; build_y(X[root],1,1001,1); if(l==r) return ; int mid=X[root].mid(); build_x(l,mid,root<<1); build_x(mid+1,r,root<<1|1); } void modify_y(tree_x &x,int a,int root,double luck) { if(luck>x.Y[root].max) x.Y[root].max=luck; if(x.Y[root].l==x.Y[root].r) return ; int mid=x.Y[root].mid(); if(a<=mid) modify_y(x,a,root<<1,luck); else modify_y(x,a,root<<1|1,luck); x.Y[root].max=max(x.Y[root<<1].max,x.Y[root<<1|1].max); } void modify_x(int h,int a,int root,double luck) { modify_y(X[root],a,1,luck); if(X[root].l==X[root].r) return ; int mid=X[root].mid(); if(h<=mid) modify_x(h,a,root<<1,luck); else modify_x(h,a,root<<1|1,luck); } double query_y(tree_x &x,int al,int ar,int root) { if(x.Y[root].l==al&&x.Y[root].r==ar) return x.Y[root].max; int mid=x.Y[root].mid(); if(ar<=mid) return query_y(x,al,ar,root<<1); else if(al>=mid+1) return query_y(x,al,ar,root<<1|1); else { double x1,x2; x1=query_y(x,al,mid,root<<1); x2=query_y(x,mid+1,ar,root<<1|1); return max(x1,x2); } return -1; } double query_x(int hl,int hr,int al,int ar,int root) { if(X[root].l==hl&&X[root].r==hr) return query_y(X[root],al,ar,1); int mid=X[root].mid(); if(hr<=mid) return query_x(hl,hr,al,ar,root<<1); else if(hl>=mid+1) return query_x(hl,hr,al,ar,root<<1|1); else { double x1,x2; x1=query_x(hl,mid,al,ar,root<<1); x2=query_x(mid+1,hr,al,ar,root<<1|1); return max(x1,x2); } return -1; } int main(int argc, char** argv) { int n; while(scanf("%d",&n),n) { build_x(1,101,1); for(int i=1;i<=n;i++) { char str[2]; scanf("%s",str); if(str[0]=='I') { int h; double a,l; scanf("%d%lf%lf",&h,&a,&l); modify_x(h-99,int(a*10)+1,1,l); } else { int hl,hr; double al,ar,ans; scanf("%d%d%lf%lf",&hl,&hr,&al,&ar); if(hl>hr) swap(hl,hr); if(al>ar) swap(al,ar); ans=query_x(hl-99,hr-99,int(al*10)+1,int(ar*10)+1,1); if(ans<0) puts("-1"); else printf("%.1lf/n",ans); } } } return 0; }