首页 > 其他 > 详细

【二维线段树】 HDU 1823 Luck and Love | HDU 4819 Mosaic

时间:2014-02-18 08:36:22      阅读:265      评论:0      收藏:0      [点我收藏+]

 【HDU 1823   Luck and Love】

原题直通车:HDU 1823 Luck and Love

题意:成块(矩形)更新最大值

代码:

#include<iostream>
#include<cstdio>
#include<climits>
#include<cstring>

#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
#define Mid (L+R)>>1
using namespace std;
const int INF = INT_MAX;
const int maxn = 1005;

int n, m;
int Max[105<<2][maxn<<2];
int x, y, v, ans, ro, xleaf;
int x1, y1, x2, y2;

void query1D(int L, int R, int rt) {
    if(y1 <= L && R<=y2) {
        ans = max(Max[ro][rt], ans);
    } else {
        int mid = Mid;
        if(y1 <= mid) query1D(Lson);
        if(y2 > mid)  query1D(Rson);
    }
}
void query2D(int L, int R, int rt) {
    if(x1 <= L && R <= x2) {
        ro = rt;
        query1D(0, m, 1);
    } else {
        int mid = Mid;
        if(x1 <= mid) query2D(Lson);
        if(x2 > mid)  query2D(Rson);
    }
}
void update1D(int L, int R, int rt) {
    if( L == R) {
        if(xleaf) {
            Max[ro][rt] = max(Max[ro][rt], v);
            return ;
        }
        Max[ro][rt] = max(Max[ro<<1][rt], Max[ro<<1|1][rt]);
    } else {
        int mid = Mid;
        if(y <= mid) update1D(Lson);
        else update1D(Rson);
        Max[ro][rt] = max(Max[ro][rt<<1], Max[ro][rt<<1|1]);
    }
}

void update2D(int L, int R, int rt) {
    if(L == R) {
        ro = rt;
        xleaf = 1;
        update1D(0, m, 1);
    } else {
        int mid = Mid;
        if(x <= mid) update2D(Lson);
        else update2D(Rson);
        ro = rt;
        xleaf = 0;
        update1D(0, m, 1);
    }
}

int main() {
    int T;
    while(~scanf("%d", &T) && T) {
        n = 100, m = 1000;
        memset(Max, -1, sizeof(Max));
        while(T--) {
            char op[3];
            scanf("%s", op);
            if(op[0] == ‘I‘) {
                int h; double a, b;
                scanf("%d%lf%lf", &h, &a, &b);
                x = h - 100, y = (int)(a*10), v = (int)(b*10);
                update2D(0, n, 1);
            } else {
                int h, u; double a, b;
                scanf("%d%d%lf%lf", &h, &u, &a, &b);
                x1 = h - 100, y1 = (int)(a*10);
                x2 = u - 100, y2 = (int)(b*10);
                if(x1 > x2) swap(x1, x2);
                if(y1 > y2) swap(y1, y2);
                ans = -1;
                query2D(0, n, 1);
                if(ans == -1) {
                    puts("-1"); continue;
                }
                printf("%.1lf\n", ans/10.0);
            }
        }
    }
    return 0;
}




 【HDU 4819   Mosaic】

原题直通车: HDU 4819 Mosaic

题意:成块查寻最大值、最小值,并单点更新。

代码:

#include<iostream>
#include<cstdio>
#include<climits>

#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
#define Mid (L+R)>>1

using namespace std;
const int INF = INT_MAX;
const int maxn = 800<<2;

int n, m;
int Max[maxn][maxn], Min[maxn][maxn];
int ro, xleaf;
int x1, y1, x2, y2;
int x, y, v, l;
int maxx, minx;

void query1D(int L, int R, int rt) {
    if(y1 <= L && R<=y2) {
        maxx = max(Max[ro][rt], maxx);
        minx = min(Min[ro][rt], minx);
    } else {
        int mid = Mid;
        if(y1 <= mid) query1D(Lson);
        if(y2 > mid)  query1D(Rson);
    }
}

void query2D(int L, int R, int rt) {
    if(x1 <= L && R <= x2) {
        ro = rt;
        query1D(1, m, 1);
    } else {
        int mid = Mid;
        if(x1 <= mid) query2D(Lson);
        if(x2 > mid)  query2D(Rson);
    }
}

void update1D(int L, int R, int rt) {
    if( L == R) {
        if(xleaf) {
            Max[ro][rt] = Min[ro][rt] = v;
            return ;
        }
        Max[ro][rt] = max(Max[ro<<1][rt], Max[ro<<1|1][rt]);
        Min[ro][rt] = min(Min[ro<<1][rt], Min[ro<<1|1][rt]);
    } else {
        int mid = Mid;
        if(y <= mid) update1D(Lson);
        else update1D(Rson);
        Max[ro][rt] = max(Max[ro][rt<<1], Max[ro][rt<<1|1]);
        Min[ro][rt] = min(Min[ro][rt<<1], Min[ro][rt<<1|1]);
    }
}
void update2D(int L, int R, int rt) {
    if(L == R) {
        ro = rt;
        xleaf = 1;
        update1D(1, m, 1);
    } else {
        int mid = Mid;
        if(x <= mid) update2D(Lson);
        else update2D(Rson);
        ro = rt;
        xleaf = 0;
        update1D(1, m, 1);
    }
}

int main() {
    int T, cas = 1; scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        m = n;
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=m; ++j)   {
                scanf("%d", &v);
                x = i, y = j;
                update2D(1, n, 1);
            }
        int Q; scanf("%d", &Q);
        printf("Case #%d:\n", cas++);
        while(Q--) {
            scanf("%d%d%d", &x, &y, &l);
            l >>= 1;
            x1 = max(1, x-l), y1 = max(1, y-l);
            x2 = min(n, x+l), y2 = min(n, y+l);
            maxx = -INF, minx = INF;
            query2D(1, n, 1);
            v = (maxx+minx)>>1;
            printf("%d\n", v);
            update2D(1, n, 1);
        }
    }
    return 0;
}





【二维线段树】 HDU 1823 Luck and Love | HDU 4819 Mosaic

原文:http://blog.csdn.net/du489380262/article/details/19341451

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!