HDU 4819 二维线段树
2016-05-22 11:21
405 查看
#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; }
模板题。
相关文章推荐
- 专题三 · 1018
- java命令行运行带外部jar
- Git入门简介
- 第十二周进度条
- 动态规划10之1015
- Contiki协议栈Rime:引子introduction
- 不忘初心,再创辉煌。
- JavaScript-获取固定格式日期(2016-05-22)以及"连续"获取前一天、后一天的方法总结
- 手把手教你纯命令行打包apk
- tomcat中不同项目共享session数据
- PAT 1042. 字符统计(20)
- 项目中应用Redis+Php的场景
- 说大学毕业等于失业?你是不是傻!
- 分层开发(MySchool总结)
- 117. Populating Next Right Pointers in Each Node II
- spark PIPELINE 的交叉验证
- 推荐几个在线PDF转化成Word网站
- 数据集
- hdu1227 Fast Food
- 从SEO角度出发,我们应该禁止搜索引擎对网站分页的抓取