2 条题解

  • 0
    @ 2025-9-15 14:35:23

    c++ ac代码 二维转化成一维

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int a[1010][1010],b[1010][1010];//a数组存储原来数字 b数组用来存差分
    signed main(){
     int n,m,q;
     cin>>n>>m>>q;
     for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(j!=1)
            b[i][j]=a[i][j]-a[i][j-1];
            else {
            b[i][j]=a[i][j];//第一列就等于原本的
            }
        }
     }
     for(int k=1;k<=q;k++){
        int x1,y1,x2,y2,ans=0,d;
        cin>>x1>>y1>>x2>>y2>>d;
        
        for(int i=x1;i<=x2;i++){
            b[i][y1]+=d;//y1开始差分
            b[i][y2+1]-=d;//y2+1减去
        }
     }
     for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(j!=1){
                a[i][j]=a[i][j-1]+b[i][j];
                cout<<a[i][j]<<" ";
            }
            else {
                a[i][j]=b[i][j];
                cout<<a[i][j]<<" ";
            }
        }
        cout<<endl;
     }
    }
    

    然鹅这个代码还是一维的时间复杂度 数据太水了可以过去!!! 我们需要二维的根本差分

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int a[1050][1050],b[1050][1000];
    int n,m,q;
    signed main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    while(q--){
        int x1,x2,y1,y2,d;
        cin>>x1>>y1>>x2>>y2>>d;
        b[x1][y1]+=d;
        b[x2+1][y1]-=d;b[x1][y2+1]-=d;
        b[x2+1][y2+1]+=d;
        
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
            cout<<b[i][j]+a[i][j]<<" ";
        }
        cout<<endl;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    }
    
    

    信息

    ID
    41
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    51
    已通过
    31
    上传者