HDU 1823 Luck and Love 第一回写二维线段树,虽然MLE了,但是还是把代码留下来做个纪念,毕竟敲这么长的代码也不容易啊!!!!! #include <iostream> using namespace std; struct node { short h_from; short h_to; short a_from; short a_to; short l_max; short h_max; short a_max; node *lu; node *ld; node *ru; node *rd; }; node nod[1400000]; node *root; int t; int maxFour(int x, int y, int z, int k) { int maxx = -1; if(x > maxx) maxx = x; if(y > maxx) maxx = y; if(z > maxx) maxx = z; if(k > maxx) maxx = k; return maxx; } void getNode(node *ptr, int hf, int ht, int af, int at) { ptr->l_max = -1; ptr->h_from = hf; ptr->h_to = ht; ptr->a_from = af; ptr->a_to = at; ptr->h_max = hf; ptr->a_max = af; } void builtTree(node *ptr) { if(ptr->a_from == ptr->a_to && ptr->h_from == ptr->h_to) return; int a_avg = (ptr->a_from + ptr->a_to)/2; int h_avg = (ptr->h_from + ptr->h_to)/2; int aa_avg = a_avg+1; int hh_avg = h_avg+1; if(aa_avg > ptr->a_to) aa_avg--; if(hh_avg > ptr->h_to) hh_avg--; ptr->ld = &nod[t++]; getNode(ptr->ld, ptr->h_from, h_avg, aa_avg, ptr->a_to); builtTree(ptr->ld); ptr->lu = &nod[t++]; getNode(ptr->lu, ptr->h_from, h_avg, ptr->a_from, a_avg); builtTree(ptr->lu); ptr->rd = &nod[t++]; getNode(ptr->rd, hh_avg, ptr->h_to, aa_avg, ptr->a_to); builtTree(ptr->rd); ptr->ru = &nod[t++]; getNode(ptr->ru, hh_avg, ptr->h_to, ptr->a_from, a_avg); builtTree(ptr->ru); } void insert(node *ptr, int h, int a, int l) { if(l > ptr->l_max) { ptr->l_max = l; ptr->a_max = a; ptr->h_max = h; } if(ptr->a_from == ptr->a_to && ptr->h_from == ptr->h_to) { return; } int a_avg = (ptr->a_from + ptr->a_to)/2; int h_avg = (ptr->h_from + ptr->h_to)/2; if(a <= a_avg && h <= h_avg) insert(ptr->lu, h, a, l); if(a <= a_avg && h > h_avg) insert(ptr->ru, h, a, l); if(a > a_avg && h <= h_avg) insert(ptr->ld, h, a, l); if(a > a_avg && h > a_avg) insert(ptr->rd, h, a, l); } int query(node *ptr, int hf, int ht, int af, int at) { if(ptr->a_from == af && ptr->a_to == at && ptr->h_from == hf && ptr->h_to == ht) return ptr->l_max; if(ptr->h_max >= hf && ptr->h_max <= ht && ptr->a_max >= af && ptr->a_max <= at) return ptr->l_max; int a_avg = (ptr->a_from + ptr->a_to)/2; int h_avg = (ptr->h_from + ptr->h_to)/2; int aa_avg = a_avg+1; int hh_avg = h_avg+1; if(aa_avg > ptr->a_to) aa_avg--; if(hh_avg > ptr->h_to) hh_avg--; if(at <= a_avg && ht <= h_avg) return query(ptr->lu, hf, ht, af, at); if(at <= a_avg && hf > h_avg) return query(ptr->ru, hf, ht, af, at); if(af > a_avg && ht <= h_avg) return query(ptr->ld, hf, ht, af, at); if(af > a_avg && hf > h_avg) return query(ptr->rd, hf, ht, af, at); if(at <= a_avg) return max(query(ptr->lu, hf, h_avg, af, at), query(ptr->ru, hh_avg, ht, af, at)); if(af > a_avg) return max(query(ptr->ld, hf, h_avg, af, at), query(ptr->rd, hh_avg, ht, af, at)); if(ht <= h_avg) return max(query(ptr->lu, hf, ht, af, a_avg), query(ptr->ld, hf, ht, aa_avg, at)); if(hf > h_avg) return max(query(ptr->ru, hf, ht, af, a_avg), query(ptr->rd, hf, ht, aa_avg, at)); return maxFour(query(ptr->lu, hf, h_avg, af, a_avg), query(ptr->ld, hf, h_avg, aa_avg, at), query(ptr->ru, hh_avg, ht, af, a_avg), query(ptr->rd, hh_avg, ht, aa_avg, at)); } int main() { char c; int n, h, hf, ht, res, i; double a, l, af, at; while(scanf("%d", &n) != EOF && n) { t = 1; root = &nod[t++]; getNode(root, 100, 200, 0, 1000); builtTree(root); for(i = 1; i <= n; i++) { getchar(); c = getchar(); if(c == 'I') { scanf("%d %lf %lf", &h, &a, &l); insert(root, h, (int)(a*10), (int)(l*10)); } else { scanf("%d %d %lf %lf", &hf, &ht, &af, &at); res = query(root, hf, ht, (int)(af*10), (int)(at*10)); printf("%.1lf/n", res/10.0); } } } return 0; }