长春现场赛的题目,比较裸的一道二维线段树,只可惜当时不会写。。。
首先按一维进行更新、查询,到结束条件后,再按第二维进行更新查找。
#include
#include
#include
#include
#include
using namespace std;
const int maxn=810;
const int INF=1000000000;
int n,xl,xr,yl,yr;
int maxv,minv,ans;
int grid[maxn][maxn];
struct IntevalTree
{
int max1[maxn<<3][maxn<<3];
int min1[maxn<<3][maxn<<3];
void pushup(int xo,int o)
{
max1[xo][o]=max(max1[xo][o<<1],max1[xo][o<<1|1]);
min1[xo][o]=min(min1[xo][o<<1],min1[xo][o<<1|1]);
}
void buildY(int xo,int o,int l,int r,int x)
{
if(l==r)
{
if(x!=-1){max1[xo][o]=min1[xo][o]=grid[x][l];}
else
{
max1[xo][o]=max(max1[xo<<1][o],max1[xo<<1|1][o]);
min1[xo][o]=min(min1[xo<<1][o],min1[xo<<1|1][o]);
}
return;
}
int mid=(l+r)/2;
buildY(xo,o*2,l,mid,x);
buildY(xo,o*2+1,mid+1,r,x);
pushup(xo,o);
}
void buildX(int o,int l,int r)
{
if(l==r)
{
buildY(o,1,1,n,l);
return ;
}
int mid=(l+r)/2;
buildX(o*2,l,mid);
buildX(o*2+1,mid+1,r);
buildY(o,1,1,n,-1);
}
void queryY(int xo,int o,int l,int r)
{
if(yl<=l&&r<=yr)
{
maxv=max(maxv,max1[xo][o]);
minv=min(minv,min1[xo][o]);
return;
}
int mid=(l+r)/2;
if(yl<=mid)queryY(xo,o*2,l,mid);
if(yr>mid)queryY(xo,o*2+1,mid+1,r);
}
void queryX(int o,int l,int r)
{
if(xl<=l&&r<=xr)
{
queryY(o,1,1,n);
return ;
}
int mid=(l+r)/2;
if(xl<=mid)queryX(o*2,l,mid);
if(xr>mid)queryX(o*2+1,mid+1,r);
}
void updateY(int xo,int o,int l,int r,int x)
{
if(l==r)
{
if(x!=-1){max1[xo][o]=min1[xo][o]=ans;}
else
{
max1[xo][o]=max(max1[xo<<1][o],max1[xo<<1|1][o]);
min1[xo][o]=min(min1[xo<<1][o],min1[xo<<1|1][o]);
}
return;
}
int mid=(l+r)/2;
if(yl<=mid)updateY(xo,o*2,l,mid,x);
else updateY(xo,o*2+1,mid+1,r,x);
pushup(xo,o);
}
void updateX(int o,int l,int r)
{
if(l==r)
{
updateY(o,1,1,n,l);
return;
}
int mid=(l+r)/2;
if(xl<=mid)updateX(o*2,l,mid);
else updateX(o*2+1,mid+1,r);
updateY(o,1,1,n,-1);
}
}tree;
int main()
{
//freopen("in.txt","r",stdin);
int t,cas=1,q;
int x,y,len;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)scanf("%d",&grid[i][j]);
tree.buildX(1,1,n);
scanf("%d",&q);
printf("Case #%d:\n",cas++);
while(q--)
{
scanf("%d%d%d",&x,&y,&len);
len=(len+1)/2;
xl=max(1,x-len+1);xr=min(n,x+len-1);
yl=max(1,y-len+1);yr=min(n,y+len-1);
maxv=-INF,minv=INF;
tree.queryX(1,1,n);
ans=(minv+maxv)/2;
printf("%d\n",ans);
xl=x,yl=y;
tree.updateX(1,1,n);
}
}
return 0;
}