标签:
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