标签:
1 3 1 2 3 4 5 6 7 8 9 5 2 2 1 3 2 3 1 1 3 1 2 3 2 2 3
Case #1: 5 6 3 4 6
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<climits>
#include<list>
#include<iomanip>
#include<stack>
#include<set>
using namespace std;
const int N=810;
int ir[N],ic[N];
struct Nr
{
int l,r;
struct Nc
{
int l,r,mx,mn;
}nc[N<<2];
void build(int l,int r,int k)
{
nc[k].l=l;
nc[k].r=r;
nc[k].mn=INT_MAX;
nc[k].mx=INT_MIN;
if(l==r)
{
ic[l]=k;
return;
}
int m=(l+r)>>1;
build(l,m,k<<1);
build(m+1,r,k<<1|1);
}
int seek(int l,int r,int k,bool flag)
{
if(nc[k].l==l&&nc[k].r==r)
return flag?nc[k].mx:nc[k].mn;
int m=nc[k].l+nc[k].r>>1;
if(r<=m)
return seek(l,r,k<<1,flag);
if(l>m)
return seek(l,r,k<<1|1,flag);
return flag?max(seek(l,m,k<<1,flag),seek(m+1,r,k<<1|1,flag)):
min(seek(l,m,k<<1,flag),seek(m+1,r,k<<1|1,flag));
}
}nr[N<<2];
void update(int r,int c,int val)
{
nr[ir[r]].nc[ic[c]].mn=nr[ir[r]].nc[ic[c]].mx=val;
for(int i=ir[r];i>0;i>>=1)
for(int j=ic[c];j>0;j>>=1)
{
if(i==ir[r]&&j==ic[c])
continue;
if(j==ic[c])//行线段树更新叶子
{
nr[i].nc[j].mx=max(nr[i<<1].nc[j].mx,nr[i<<1|1].nc[j].mx);
nr[i].nc[j].mn=min(nr[i<<1].nc[j].mn,nr[i<<1|1].nc[j].mn);
}
else//更新列线段树
{
nr[i].nc[j].mx=max(nr[i].nc[j<<1].mx,nr[i].nc[j<<1|1].mx);
nr[i].nc[j].mn=min(nr[i].nc[j<<1].mn,nr[i].nc[j<<1|1].mn);
}
}
}
int seek(int l,int r,int l1,int r1,int k,bool flag)
{
if(nr[k].l==l&&nr[k].r==r)
return nr[k].seek(l1,r1,1,flag);
int m=nr[k].l+nr[k].r>>1;
if(r<=m)
return seek(l,r,l1,r1,k<<1,flag);
if(l>m)
return seek(l,r,l1,r1,k<<1|1,flag);
return flag?max(seek(l,m,l1,r1,k<<1,flag),seek(m+1,r,l1,r1,k<<1|1,flag)):
min(seek(l,m,l1,r1,k<<1,flag),seek(m+1,r,l1,r1,k<<1|1,flag));
}
void build(int l,int r,int n,int k)
{
nr[k].l=l;
nr[k].r=r;
nr[k].build(1,n,1);
if(l==r)
{
ir[l]=k;
return;
}
int m=(l+r)>>1;
build(l,m,n,k<<1);
build(m+1,r,n,k<<1|1);
}
int main()
{
int T;
scanf("%d",&T);
for(int cs=1;cs<=T;cs++)
{
printf("Case #%d:\n",cs);
int n;
scanf("%d",&n);
build(1,n,n,1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int t;
scanf("%d",&t);
update(i,j,t);
}
int q;
scanf("%d",&q);
while(q--)
{
int r,c,L;
scanf("%d%d%d",&r,&c,&L);
int r1=max(r-L/2,1);
int r2=min(r+L/2,n);
int c1=max(c-L/2,1);
int c2=min(c+L/2,n);
int mx=seek(r1,r2,c1,c2,1,1);
int mn=seek(r1,r2,c1,c2,1,0);
int t=(mx+mn)>>1;
printf("%d\n",t);
update(r,c,t);
}
}
}标签:
原文地址:http://blog.csdn.net/stl112514/article/details/45313909