Luck and Love 【HDU - 1823】【二維線段樹】
阿新 • • 發佈:2018-11-30
題目連結
最近敲了些二維線段樹,這也是我題單裡的一道題,無非多出來的操作就是對區間端點的處理問題,給出的是浮點數,不如就把他向取整咯,一開始取整的時候總是會遇到些問題就是總是取不到恰好,會少位,怎麼辦呢?於是我這裡學到了個騷操作:(int)(x*10. + efs);其中,efs指的是1e-6。
這道題還有另外的坑點,就是對與區間,並沒有告訴你是左上角與右下角的關係,你得自己進行處理。
#include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #define lowbit(x) ( x&(-x) ) #define efs 1e-6 #define pi 3.141592653589793 #define e 2.718281828459045 using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxN = 105; int M; int tree[maxN<<2][maxN*10<<2]; void update_In(int rt, int x0, int l, int r, int qy, int val, bool flag) { if(l == r) { if(flag) tree[x0][rt] = max(tree[x0][rt], val); else tree[x0][rt] = max(tree[x0<<1][rt], tree[x0<<1|1][rt]); return; } int mid = (l + r)>>1; if(qy<=mid) update_In(rt<<1, x0, l, mid, qy, val, flag); else update_In(rt<<1|1, x0, mid+1, r, qy, val, flag); tree[x0][rt] = max(tree[x0][rt<<1], tree[x0][rt<<1|1]); } void update_Out(int rt, int l, int r, int qx, int qy, int val) { if(l == r) { update_In(1, rt, 0, 1000, qy, val, true); return; } int mid = (l + r)>>1; if(qx<=mid) update_Out(rt<<1, l, mid, qx, qy, val); else update_Out(rt<<1|1, mid+1, r, qx, qy, val); update_In(1, rt, 0, 1000, qy, val, false); } double query_In(int rt, int x0, int l, int r, int ql, int qr) { if(ql<=l && qr>=r) return tree[x0][rt]; int mid = (l + r)>>1; if(ql>mid) return query_In(rt<<1|1, x0, mid+1, r, ql, qr); else if(qr<=mid) return query_In(rt<<1, x0, l, mid, ql, qr); else { double ans = query_In(rt<<1|1, x0, mid+1, r, ql, qr); ans = max(ans, query_In(rt<<1, x0, l, mid, ql, qr)); return ans; } } double query_Out(int rt, int l, int r, int qlx, int qly, int qrx, int qry) { if(qlx<=l && qrx>=r) return query_In(1, rt, 0, 1000, qly, qry); int mid = (l + r)>>1; if(qlx>mid) return query_Out(rt<<1|1, mid+1, r, qlx, qly, qrx, qry); else if(qrx<=mid) return query_Out(rt<<1, l, mid, qlx, qly, qrx, qry); else { double ans = query_Out(rt<<1|1, mid+1, r, qlx, qly, qrx, qry); ans = max(ans, query_Out(rt<<1, l, mid, qlx, qly, qrx, qry)); return ans; } } int main() { while(scanf("%d", &M) && M) { memset(tree, -1, sizeof(tree)); while(M--) { char s[3]; scanf("%s", s); if(s[0] == 'I') { int H; double A, L; scanf("%d", &H); scanf("%lf%lf", &A, &L); update_Out(1, 100, 200, H, (int)(10.*A+efs), (int)(10.*L+efs)); } else { int H1, H2; double A1, A2; scanf("%d%d", &H1, &H2); scanf("%lf%lf", &A1, &A2); if(H1 > H2) swap(H1, H2); if(A1 > A2) swap(A1, A2); int tmp =query_Out(1, 100, 200, H1, (int)(10.*A1+efs), H2, (int)(10.*A2+efs)); if(tmp>=0) printf("%.1lf\n", 1.*tmp/10); else printf("-1\n"); } } } return 0; }