您的位置:首页 > 大数据 > 人工智能

HDU 4819 Mosaic(二维线段树模板)

2015-10-29 19:16 597 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819

题意:

对于二维的矩阵,需要查询一个区域的最大和最小值。

修改单个点的值。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define _lson _l, _m, _rt<<1
#define _rson _m+1, _r, _rt<<1|1
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1

const int maxn = 1000;
const int inf = 0x3f3f3f3f;
struct Nodey
{
int Min, Max;
};
int locy[maxn], locx[maxn];
struct Nodex
{
Nodey sty[maxn<<2];
void build(int _l, int _r, int _rt)
{
sty[_rt].Max = -inf;
sty[_rt].Min = inf;
if(_l == _r)
{
locy[_l] = _rt;
return ;
}
int _m = (_l + _r)>>1;
build(_lson);
build(_rson);
}
int query_min(int L, int R, int _l, int _r, int _rt)
{
if(L<=_l && _r<=R)
return sty[_rt].Min;
int Min = inf;
int _m = (_l + _r)>>1;
if(L <= _m)
Min = min(Min, query_min(L, R, _lson));
if(R > _m)
Min = min(Min, query_min(L, R, _rson));
return Min;
}
int query_max(int L, int R, int _l, int _r, int _rt)
{
if(L<=_l && _r<=R)
return sty[_rt].Max;
int Max = -inf;
int _m = (_l + _r)>>1;
if(L <= _m)
Max = max(Max, query_max(L, R, _lson));
if(R > _m)
Max = max(Max, query_max(L, R, _rson));
return Max;
}
}stx[maxn<<2];
int n;
void build(int l, int r, int rt)
{
stx[rt].build(1, n, 1);
if(l == r)
{
locx[l] = rt;
return ;
}
int m = (l + r)>>1;
build(lson);
build(rson);
}
void update(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 query_min(int L, int R, int _L, int _R, int l, int r, int rt)
{
if(L<=l && r<=R)
return stx[rt].query_min(_L, _R, 1, n, 1);
int Min = inf;
int m = (l + r)>>1;
if(L <= m)
Min = min(Min, query_min(L, R, _L, _R, lson));
if(R > m)
Min = min(Min, query_min(L, R, _L, _R, rson));
return Min;
}
int query_max(int L, int R, int _L, int _R, int l, int r, int rt)
{
if(L<=l && r<=R)
return stx[rt].query_max(_L, _R, 1, n, 1);
int Max = -inf;
int m = (l + r)>>1;
if(L <= m)
Max = max(Max, query_max(L, R, _L, _R, lson));
if(R > m)
Max = max(Max, query_max(L, R, _L, _R, rson));
return Max;
}
int main()
{
int T, m, x, y, a, c, L, R, _L, _R;
scanf("%d", &T);
for(int cas = 1; cas <= T; cas++)
{
scanf("%d", &n);
build(1, n, 1);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
scanf("%d", &a);
update(i, j, a);
}
}
printf("Case #%d:\n", cas);
scanf("%d", &m);
while(m--)
{
scanf("%d%d%d", &x, &y, &c);
L = max(x-c/2, 1);
R = min(x+c/2, n);
_L = max(y-c/2, 1);
_R = min(y+c/2, n);
int Max = query_max(L, R, _L, _R, 1, n, 1);
int Min = query_min(L, R, _L, _R, 1, n, 1);
int val = (Max + Min)/2;
printf("%d\n", val);
update(x, y, val);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: