二维差分模板

int dif[1005][1005];
void solve(){
    int n,m,a,b;cin>>n>>m>>a>>b;
    rep(i,0,n+1)rep(j,0,m+1)dif[i][j]=0;

    vector<vector<int>>g(n+1,vector<int>(m+1));
    rep(i,1,n)rep(j,1,m)cin>>g[i][j];
    rep(i,1,n){
        rep(j,1,m){
            dif[i][j] = g[i][j]-g[i-1][j]-g[i][j-1]+g[i-1][j-1];
        }
    }
    auto work =[&](int x,int y,int a,int b,int s){
        int xx= x+a,yy=y+b;
        dif[x][y]+=s;
        dif[xx][y]-=s;
        dif[x][yy]-=s;
        dif[xx][yy]+=s;
    };


    rep(i,1,n){
        rep(j,1,m){
            dif[i][j]=dif[i][j]+dif[i-1][j]+dif[i][j-1]-dif[i-1][j-1];
            if(dif[i][j]<0){
                cout<<"QAQ"<<endl;return;
            }else if(dif[i][j]>0){
                if(i+a-1>n||j+b-1>m){
                    cout<<"QAQ"<<endl;return;
                }else work(i,j,a,b,-dif[i][j]);
            }
        }
    }
    cout<<"^_^"<<endl;
}
posted @ 2025-09-23 13:21  Marinaco  阅读(8)  评论(0)    收藏  举报
//雪花飘落效果