分析: 题目的意思很好理解,就是选择满足在 H1--H2,与A1---A2 之间的最大的 L。 显然该用二维线段树来做,代码很好写,需要注意 H1 > H2 和 A1 > A2 的情况。 另外还需要采用double 型。
code 1#include<iostream> 2using namespace std; 3 4const int maxn=4000; 5 6struct node_y 7{ 8 int left,right; 9 int mid; 10 double max; 11}; 12 13struct node_x 14{ 15 int left,right; 16 int mid; 17 node_y Y[maxn]; 18}; 19 20node_x X[400]; 21 22void Creat_y(node_x &x,int id,int from,int to) 23{ 24 x.Y[id].left=from; 25 x.Y[id].right=to; 26 x.Y[id].mid=(from+to)>>1; 27 x.Y[id].max=-1; 28 29 if(from==to) return ; 30 31 Creat_y(x,2*id,from,x.Y[id].mid); 32 Creat_y(x,2*id+1,x.Y[id].mid+1,to); 33} 34 35void Creat_tree(int id,int from,int to) 36{ 37 X[id].left=from; 38 X[id].right=to; 39 X[id].mid=(from+to)>>1; 40 Creat_y(X[id],1,1,1001); 41 42 if(from==to)return ; 43 44 Creat_tree(2*id,from,X[id].mid); 45 Creat_tree(2*id+1,X[id].mid+1,to); 46} 47 48int Update_y(node_x &x,int id,int a,float luck) 49{ 50 if(luck>x.Y[id].max)x.Y[id].max=luck; 51 52 if(x.Y[id].left==x.Y[id].right) 53 return 1; 54 if(a<=x.Y[id].mid) 55 Update_y(x,2*id,a,luck); 56 else 57 Update_y(x,2*id+1,a,luck); 58 return 1; 59} 60 61int Update_x(int id,int h,int a,float luck) 62{ 63 64 Update_y(X[id],1,a,luck); 65 66 if(X[id].left==X[id].right) 67 return 1; 68 if(h<=X[id].mid) 69 Update_x(2*id,h,a,luck); 70 else 71 Update_x(2*id+1,h,a,luck); 72 return 1; 73} 74 75float Find_y(node_x &x,int id,int a1,int a2) 76{ 77 if(x.Y[id].left==a1 && x.Y[id].right==a2) 78 return x.Y[id].max; 79 80 if(a2<=x.Y[id].mid) 81 return Find_y(x,2*id,a1,a2); 82 if(a1>x.Y[id].mid) 83 return Find_y(x,2*id+1,a1,a2); 84 85 float l1=Find_y(x,2*id,a1,x.Y[id].mid); 86 float l2=Find_y(x,2*id+1,x.Y[id].mid+1,a2); 87 88 return l1>l2? l1:l2; 89} 90 91float Find_x(int id,int h1,int h2,int a1,int a2) 92{ 93 float l1,l2; 94 95 if(X[id].left==h1&&X[id].right==h2) 96 { 97 return Find_y(X[id],1,a1,a2); 98 } 99 if(h2<=X[id].mid) 100 return Find_x(2*id,h1,h2,a1,a2); 101 if(h1>X[id].mid) 102 return Find_x(2*id+1,h1,h2,a1,a2); 103 104 l1=Find_x(2*id,h1,X[id].mid,a1,a2); 105 l2=Find_x(2*id+1,X[id].mid+1,h2,a1,a2); 106 107 return l1>l2? l1:l2; 108} 109 110int main() 111{ 112 int H,A,H1,H2,A1,A2,m; 113 double L,L1,L2,luck; 114 char c; 115 116 while(EOF!=scanf("%d",&m)&&m) 117 { 118 Creat_tree(1,1,101); 119 while(m--) 120 { 121 getchar(); 122 scanf("%c",&c); 123 if(c=='I') 124 { 125 scanf("%d%lf%lf",&H,&L,&luck); 126 A=int( L*10)+1; 127 Update_x(1,H-99,A,luck); 128 } 129 else 130 { 131 scanf("%d%d%lf%lf",&H1,&H2,&L1,&L2); 132 A1=int(L1*10)+1; 133 A2=int(L2*10)+1; 134 135 if(A1>A2)swap(A1,A2); 136 if(H1>H2)swap(H1,H2); 137 138 luck=Find_x(1,H1-99,H2-99,A1,A2); 139 140 if(luck<0)printf("-1\n"); 141 else printf("%.1lf\n",luck); 142 } 143 } 144 } 145 return 0; 146}
|