【HDOJ】1823 Luck and Love
二维线段树。wa了几次,不存在输出-1,而不再是一位小数。
1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 105 5 #define MAXM 1005 6 #define lson l, mid, rt<<1 7 #define rson mid+1, r, rt<<1|1 8 9 double sons[MAXN<<2][MAXM<<2]; 10 11 inline double mymax(double a, double b) { 12 return (a>b) ? a:b; 13 } 14 15 inline void PushUP(int rt, int index) { 16 sons[index][rt] = mymax(sons[index][rt<<1], sons[index][rt<<1|1]); 17 } 18 19 void build_son(int l, int r, int rt, int index) { 20 sons[index][rt] = -1; 21 if (l == r) 22 return ; 23 int mid = (l+r)>>1; 24 build_son(lson, index); 25 build_son(rson, index); 26 } 27 28 void build(int l, int r, int rt) { 29 build_son(0, 1000, 1, rt); 30 if (l == r) 31 return ; 32 int mid = (l+r)>>1; 33 build(lson); 34 build(rson); 35 } 36 37 void Update_son(int l, int r, int rt, int A, double L, int index) { 38 if (l == r) { 39 if (L > sons[index][rt]) 40 sons[index][rt] = L; 41 return ; 42 } 43 int mid = (l+r)>>1; 44 if (A <= mid) 45 Update_son(lson, A, L, index); 46 else 47 Update_son(rson, A, L, index); 48 PushUP(rt, index); 49 } 50 51 void Update(int l, int r, int rt, int H, int A, double L) { 52 Update_son(0, 1000, 1, A, L, rt); 53 if (l == r) 54 return ; 55 int mid = (l+r)>>1; 56 if (H <= mid) 57 Update(lson, H, A, L); 58 else 59 Update(rson, H, A, L); 60 } 61 62 double query_son(int ll, int rr, int l, int r, int rt, int index) { 63 if (ll<=l && rr>=r) 64 return sons[index][rt]; 65 66 int mid = (l+r)>>1; 67 double max = -1; 68 69 if (ll <= mid) 70 max = mymax(max, query_son(ll, rr, lson, index)); 71 if (rr > mid) 72 max = mymax(max, query_son(ll, rr, rson, index)); 73 return max; 74 } 75 76 double query(int ll, int rr, int l, int r, int rt, int A1, int A2) { 77 if (ll<=l && rr>=r) 78 return query_son(A1, A2, 0, 1000, 1, rt); 79 80 int mid = (l+r)>>1; 81 double max = -1; 82 83 if (ll <= mid) 84 max = mymax(max, query(ll, rr, lson, A1, A2)); 85 if (rr > mid) 86 max = mymax(max, query(ll, rr, rson, A1, A2)); 87 return max; 88 } 89 90 int main() { 91 int n; 92 int h1, h2, tmp; 93 double a, b, c; 94 char cmd[3]; 95 96 while (scanf("%d", &n)!=EOF && n) { 97 build(100, 200, 1); 98 while (n--) { 99 scanf("%s", cmd); 100 if (cmd[0] == 'I') { 101 scanf("%d %lf %lf", &h1, &a, &b); 102 Update(100, 200, 1, h1, (int)(a*10), b); 103 } else { 104 scanf("%d %d %lf %lf", &h1, &h2, &a, &b); 105 if (h1 > h2) { 106 tmp = h1; 107 h1 = h2; 108 h2 = tmp; 109 } 110 if (a > b) { 111 c = a; 112 a = b; 113 b = c; 114 } 115 b = query(h1, h2, 100, 200, 1, (int)(a*10), (int)(b*10)); 116 if (b < 0) 117 printf("-1\n"); 118 else 119 printf("%.1lf\n", b); 120 } 121 } 122 } 123 124 return 0; 125 }