1. 程式人生 > >Luck and Love 【HDU - 1823】【二維線段樹】

Luck and Love 【HDU - 1823】【二維線段樹】

題目連結


  最近敲了些二維線段樹,這也是我題單裡的一道題,無非多出來的操作就是對區間端點的處理問題,給出的是浮點數,不如就把他向取整咯,一開始取整的時候總是會遇到些問題就是總是取不到恰好,會少位,怎麼辦呢?於是我這裡學到了個騷操作:(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;
}