HDU 4819 二维线段树

来源:互联网 发布:php网页视频直播源码 编辑:程序博客网 时间:2024/05/17 19:21
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>const int maxn = 1E3 + 10;const int INF = 0x3f3f3f3f;using namespace std;struct Nodey{int l, r;int Max, Min;};int locy[maxn], locx[maxn];struct Nodex{int l, r;Nodey sty[maxn * 4];void build(int i, int _l, int _r){sty[i].l = _l;sty[i].r = _r;sty[i].Max = -INF;sty[i].Min = INF;if (_l == _r){locy[_l] = i;return ;}int mid = (_l + _r) / 2;build(i << 1, _l, mid);build((i << 1) | 1, mid + 1, _r);}int queryMin(int i, int _l, int _r){// printf("%d %d %d\n", i, _l, _r);if (sty[i].l == _l && sty[i].r == _r)return sty[i].Min;int mid = (sty[i].l + sty[i].r) / 2;if (_r <= mid) return queryMin((i << 1), _l, _r);else if (_l > mid) return queryMin((i << 1) | 1, _l, _r);else return min(queryMin(i << 1, _l, mid), queryMin((i << 1) | 1, mid + 1, _r));}int queryMax(int i, int _l, int _r){if (sty[i].l == _l && sty[i].r == _r)return sty[i].Max;int mid = (sty[i].l + sty[i].r) / 2;if (_r <= mid) return queryMax(i << 1, _l, _r);else if (_l > mid) return queryMax((i << 1) | 1, _l, _r);else return max(queryMax(i << 1, _l, mid), queryMax((i << 1) | 1, mid + 1, _r));}};Nodex stx[maxn * 4];int n;void build(int i, int l, int r){stx[i].l = l;stx[i].r = r;stx[i].build(1, 1, n);if (l == r) {locx[l] = i; return;}int mid = (l + r) / 2;build(i << 1, l, mid);build((i << 1) | 1, mid + 1, r);}void Modify(int x, int y, int val){int tx = locx[x];int ty = locy[y];stx[tx].sty[ty].Min = stx[tx].sty[ty].Max = val;for (int i = tx; i; i >>= 1)for (int j = ty; j; j >>= 1){if (i == tx && j == ty) continue;if (j == ty){stx[i].sty[j].Min = min(stx[i << 1].sty[j].Min, stx[(i << 1) | 1].sty[j].Min);stx[i].sty[j].Max = max(stx[i << 1].sty[j].Max, stx[(i << 1) | 1].sty[j].Max);}else{stx[i].sty[j].Min = min(stx[i].sty[j << 1].Min, stx[i].sty[(j << 1) | 1].Min);stx[i].sty[j].Max = max(stx[i].sty[j << 1].Max, stx[i].sty[(j << 1) | 1].Max);}}}int queryMin(int i, int x1, int x2, int y1, int y2){if (stx[i].l == x1 && stx[i].r == x2) return stx[i].queryMin(1, y1, y2);int mid = (stx[i].l + stx[i].r) / 2;if (x2 <= mid) return queryMin(i << 1, x1, x2, y1, y2);else if (x1 > mid) return queryMin((i << 1) | 1, x1, x2, y1, y2);else return min(queryMin(i << 1, x1, mid, y1, y2), queryMin((i << 1) | 1, mid + 1, x2, y1, y2));}int queryMax(int i, int x1, int x2, int y1, int y2){if (stx[i].l == x1 && stx[i].r == x2) return stx[i].queryMax(1, y1, y2);int mid = (stx[i].l + stx[i].r) / 2;if (x2 <= mid) return queryMax(i << 1, x1, x2, y1, y2);else if (x1 > mid) return queryMax((i << 1) | 1, x1, x2, y1, y2);else return max(queryMax(i << 1, x1, mid, y1, y2), queryMax((i << 1) | 1, mid + 1, x2, y1, y2));}int main(int argc, char const *argv[]){int T, kase = 0;scanf("%d", &T);while (T--){scanf("%d", &n);build(1, 1, n);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){int a;scanf("%d", &a);Modify(i, j, a);}int q, x, y, l;scanf("%d", &q);printf("Case #%d:\n", ++kase);while (q--){scanf("%d%d%d", &x, &y, &l);int x1 = max(x - l / 2, 1);int x2 = min(x + l / 2, n);int y1 = max(y - l / 2, 1);int y2 = min(y + l / 2, n);// printf("123\n");int Max = queryMax(1, x1, x2, y1, y2);// printf("234\n");int Min = queryMin(1, x1, x2, y1, y2);int t = (Max + Min) / 2;printf("%d\n", t);Modify(x, y, t);}}return 0;}


模板题。

0 0