数据结构(二维线段树,差分): NOI2012 魔幻棋盘

数据结构(二维线段树,差分): NOI2012 魔幻棋盘

数据结构(二维线段树,差分): NOI2012 魔幻棋盘

  貌似想复杂了……

 #include <iostream>
#include <cstring>
#include <cstdio>
#define mid ((l+r)>>1)
using namespace std;
const int maxn=;
const int maxm=;
int N,M,Q;
struct Array{
long long num[maxm];
long long *operator [](int x){
return &num[(x-)*M];
}
}a,b; long long ABS(long long x){return x>?x:-x;}
long long GCD(long long x,long long y){
return y?GCD(y,x%y):ABS(x);
} int cnt,ch[maxn][];
long long w[maxn]; void Merge(int &x,int p1,int p2,int l,int r){
if(!x)x=++cnt;
w[x]=GCD(w[p1],w[p2]);
if(l!=r){
Merge(ch[x][],ch[p1][],ch[p2][],l,mid);
Merge(ch[x][],ch[p1][],ch[p2][],mid+,r);
}
} void Build(int &x,int l,int r,long long t[]){
x=++cnt;
if(l==r){
w[x]=t[l];
return;
}
Build(ch[x][],l,mid,t);
Build(ch[x][],mid+,r,t);
w[x]=GCD(w[ch[x][]],w[ch[x][]]);
} int rt[maxm<<];
void Build(int x,int l,int r){
if(l==r){
Build(rt[x],,M,a[l]);
return;
}
Build(x<<,l,mid);
Build(x<<|,mid+,r);
Merge(rt[x],rt[x<<],rt[x<<|],,M);
} int x,y,tx,ty;
int tp,x1,y1,x2,y2;
long long d; void Change(int x,int l,int r,long long d){
if(l==r){w[x]+=d;return;}
if(mid>=ty)Change(ch[x][],l,mid,d);
else Change(ch[x][],mid+,r,d);
w[x]=GCD(w[ch[x][]],w[ch[x][]]);
} void Update(int x,int p1,int p2,int l,int r){
w[x]=GCD(w[p1],w[p2]);
if(l==r)return;
if(mid>=ty)Update(ch[x][],ch[p1][],ch[p2][],l,mid);
else Update(ch[x][],ch[p1][],ch[p2][],mid+,r);
} void Modify(int x,int l,int r,long long d){
if(l==r){
Change(rt[x],,M,d);
return;
}
if(mid>=tx)Modify(x<<,l,mid,d);
else Modify(x<<|,mid+,r,d);
Update(rt[x],rt[x<<],rt[x<<|],,M);
} long long Que(int x,int l,int r){
if(l>=y1&&r<=y2)
return w[x];
long long ret=;
if(mid>=y1)ret=Que(ch[x][],l,mid);
if(mid<y2)ret=GCD(ret,Que(ch[x][],mid+,r));
return ret;
} long long Query(int x,int l,int r){
if(l>=x1&&r<=x2)
return Que(rt[x],,M);
long long ret=;
if(mid>=x1)ret=Query(x<<,l,mid);
if(mid<x2)ret=GCD(ret,Query(x<<|,mid+,r));
return ret;
} int main(){
freopen("chessa.in","r",stdin);
freopen("chessa.out","w",stdout);
scanf("%d%d",&N,&M);
scanf("%d%d",&x,&y);
scanf("%d",&Q);
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)
scanf("%lld",&b[i][j]);
for(int i=;i<=N;i++)
for(int j=;j<=M;j++){
a[i][j]=b[i][j];
if(i<x)a[i][j]-=b[i+][j];
if(i>x)a[i][j]-=b[i-][j];
if(j<y)a[i][j]-=b[i][j+];
if(j>y)a[i][j]-=b[i][j-];
if(i!=x&&j!=y)a[i][j]+=b[i+(i<x?:-)][j+(j<y?:-)];
} Build(,,N);
while(Q--){
scanf("%d",&tp);
scanf("%d%d",&x1,&y1);
scanf("%d%d",&x2,&y2);
if(tp==){
x1=x-x1;x2=x+x2;
y1=y-y1;y2=y+y2;
printf("%lld\n",Query(,,N));
}
if(tp==){
scanf("%lld",&d); {
if(x1<=x&&y1<=y){
tx=x1-;ty=y1-;
if(tx&&ty)Modify(,,N,d);
} if(x1<=x&&y1>y){
tx=x1-;ty=y1;
if(tx)Modify(,,N,-d);
} if(x1>x&&y1<=y){
tx=x1;ty=y1-;
if(ty)Modify(,,N,-d);
} if(x1>x&&y1>y){
tx=x1;ty=y1;
Modify(,,N,d);
}
} {
if(x1<=x&&y2<y){
tx=x1-;ty=y2;
if(tx)Modify(,,N,-d);
} if(x1<=x&&y2>=y){
tx=x1-;ty=y2+;
if(tx&&ty<=M)Modify(,,N,d);
} if(x1>x&&y2<y){
tx=x1;ty=y2;
Modify(,,N,d);
} if(x1>x&&y2>=y){
tx=x1;ty=y2+;
if(ty<=M)Modify(,,N,-d);
}
} {
if(x2<x&&y1<=y){
tx=x2;ty=y1-;
if(ty)Modify(,,N,-d);
} if(x2<x&&y1>y){
tx=x2;ty=y1;
Modify(,,N,d);
} if(x2>=x&&y1<=y){
tx=x2+;ty=y1-;
if(tx<=N&&ty)Modify(,,N,d);
} if(x2>=x&&y1>y){
tx=x2+;ty=y1;
if(tx<=N)Modify(,,N,-d);
}
} {
if(x2<x&&y2<y){
tx=x2;ty=y2;
Modify(,,N,d);
} if(x2<x&&y2>=y){
tx=x2;ty=y2+;
if(ty<=M)Modify(,,N,-d);
} if(x2>=x&&y2<y){
tx=x2+;ty=y2;
if(tx<=N)Modify(,,N,-d);
} if(x2>=x&&y2>=y){
tx=x2+;ty=y2+;
if(tx<=N&&ty<=M)Modify(,,N,d);
}
} if(x1<=x&&x2>=x){
if(y1<=y){
tx=x;ty=y1-;
if(ty)Modify(,,N,-d);
}
if(y1>y){
tx=x;ty=y1;
Modify(,,N,d);
} if(y2<y){
tx=x;ty=y2;
Modify(,,N,d);
}
if(y2>=y){
tx=x;ty=y2+;
if(ty<=M)Modify(,,N,-d);
}
} if(y1<=y&&y2>=y){
if(x1<=x){
tx=x1-;ty=y;
if(tx)Modify(,,N,-d);
}
if(x1>x){
tx=x1;ty=y;
Modify(,,N,d);
} if(x2<x){
tx=x2;ty=y;
Modify(,,N,d);
}
if(x2>=x){
tx=x2+;ty=y;
if(tx<=N)Modify(,,N,-d);
}
} if(x1<=x&&x2>=x&&y1<=y&&y2>=y){
tx=x;ty=y;
Modify(,,N,d);
}
}
}
return ;
}
上一篇:Error response from daemon:###unable to delete ### (must be forced) - image is being used by stopped


下一篇:docker删除mysql镜像失败Error response from daemon: conflict: unable to delete 8809d5286227 (must be forced) - image is being used by stopped container 1a2a427273b3