您的位置:首页 > 其它

hdu 4819(裸二维线段树)

2017-10-16 21:59 190 查看
树套树,这里查询方块的最大值+最小值/2,并在x,y处更新它

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
#define clr(x,y) memset(x,y,sizeof x)
#define INF 0x3f3f3f3f
const int maxn = 800 + 10;

int maxs[maxn << 2][maxn << 2],mins[maxn << 2][maxn << 2];
int a[maxn][maxn];
int n;

void buildy(int x,int l,int r,int rt,int rtx)
{
if(l == r)
{
if(x != -1)maxs[rtx][rt] = mins[rtx][rt] = a[x][l];
else
{
maxs[rtx][rt] = max(maxs[rtx << 1][rt],maxs[rtx << 1|1][rt]);
mins[rtx][rt] = min(mins[rtx << 1][rt],mins[rtx <<1|1][rt]);
}
return;
}
int mid = (l + r) >> 1;
buildy(x,l,mid,rt << 1,rtx);
buildy(x,mid + 1,r,rt << 1|1,rtx);
maxs[rtx][rt] = max(maxs[rtx][rt << 1],maxs[rtx][rt << 1|1]);
mins[rtx][rt] = min(mins[rtx][rt << 1],mins[rtx][rt <<1|1]);
}
void buildx(int l,int r,int rt)
{
if(l == r)
{
buildy(l,1,n,1,rt);return;
}
int mid = (l + r) >> 1;
buildx(l,mid,rt << 1);
buildx(mid + 1,r,rt << 1|1);
buildy(-1,1,n,1,rt);
}
int Lx,Rx,Ly,Ry;
int ans_max,ans_min;
void queryy(int l,int r,int rt,int rtx)
{
if(Ly <= l && Ry >= r)
{
ans_max = max(ans_max,maxs[rtx][rt]);
ans_min = min(ans_min,mins[rtx][rt]);
return;
}
int mid = (l + r) >> 1;
if(Ly <= mid)queryy(l,mid,rt << 1,rtx);
if(Ry >= mid + 1)queryy(mid + 1,r,rt << 1|1,rtx);
}
void queryx(int l,int r,int rt)
{
if(Lx <= l && Rx >= r)
{
queryy(1,n,1,rt);
return;
}
int mid = (l + r) >> 1;
if(mid >= Lx)queryx(l,mid,rt << 1);
if(mid + 1 <= Rx)queryx(mid + 1,r,rt << 1|1);
}
int pos_x,pos_y;
void updatey(int x,int val,int l,int r,int rt,int rtx)
{
if(l == r)
{
if(x != -1)maxs[rtx][rt] = mins[rtx][rt] = val;
else
{
maxs[rtx][rt] = max(maxs[rtx << 1][rt],maxs[rtx <<1|1][rt]);
mins[rtx][rt] = min(mins[rtx << 1][rt],mins[rtx << 1|1][rt]);
return ;
}
return ;
}
int mid = (l + r) >> 1;
if(pos_y <= mid)updatey(x,val,l,mid,rt << 1,rtx);
else updatey(x,val,mid + 1,r,rt <<1|1,rtx);
maxs[rtx][rt] = max(maxs[rtx][rt << 1],maxs[rtx][rt <<1|1]);
mins[rtx][rt] = min(mins[rtx][rt << 1],mins[rtx][rt << 1|1]);
}
void updatex(int val,int l,int r,int rt)
{
if(l == r)
{
updatey(l,val,1,n,1,rt);return;
}
int mid = (l + r) >> 1;
if(pos_x <= mid)updatex(val,l,mid,rt <<1);
if(pos_x >= mid + 1)updatex(val,mid + 1,r,rt << 1|1);
updatey(-1,val,1,n,1,rt);
}

int main()
{
int Tcase;scanf("%d",&Tcase);
for(int ii = 1;ii <= Tcase; ii ++)
{
printf("Case #%d:\n",ii);
scanf("%d",&n);
for(int i = 1; i <= n; ++ i)for(int j = 1; j <= n;j ++)scanf("%d",&a[i][j]);
buildx(1,n,1);
int q;scanf("%d",&q);
while(q --)
{
int x,y,l;scanf("%d%d%d",&x,&y,&l);
pos_x = x,pos_y = y;
l = (l + 1)/2;
Lx = max(1,x - l + 1);Rx = min(n,x + l - 1);
Ly = max(1,y - l + 1);Ry = min(n,y + l - 1);
ans_max = -INF,ans_min = INF;
queryx(1,n,1);
// cout << ans_min << " " << ans_max << endl;
int ans = (1ll * ans_max + 1ll *ans_min) / 2;
printf("%d\n",ans);
updatex(ans,1,n,1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: