【二维线段树】 HDU 1823 Luck and Love | HDU 4819 Mosaic
2014-02-17 16:45
169 查看
【HDU 1823 Luck and Love】
原题直通车:HDU 1823 Luck and Love
题意:成块(矩形)更新最大值
代码:
【HDU 4819 Mosaic】
原题直通车: HDU 4819 Mosaic
题意:成块查寻最大值、最小值,并单点更新。
代码:
原题直通车: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 二维线段树模板
- hdu1823 二维线段树
- 【2012中山市选】最大立方体空间(二维线段树)
- poj1151&hdu1542Atlantis(线段树+离散化+线扫描 VS 二维线段树)
- HDU 5517 Triple(去重+线段树|二维树状数组)
- poj Matrix 2155 (树状数组&&二维线段树) 好题
- 2013 Asia Regional Changchun HDU 4819 Mosaic (二维线段树)
- POJ 2155 Matrix 二维线段树
- HDU 4819 Mosaic --二维线段树(树套树)
- hdu4819 Mosaic 二维线段树(树套树)
- HDU 1823 Luck and Love 【二维线段树】
- BZOJ 2877 NOI2012 魔幻棋盘 二维线段树
- HDU 1823 二维线段树
- HDU-4819: Mosaic(二维线段树(树套树))
- http://acm.hdu.edu.cn/showproblem.php?pid=2642 二维线段树
- HDU1832 二维线段树求最值(模板)
- POJ 2155 Matrix(快)(二维线段树段更新求点和)(不保存left,right域)
- poj 2155 二维线段树
- POJ 2155 Matrix(二维线段树)