您的位置:首页 > 其它

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;
}


模板题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: