1 solutions

  • 0
    @ 2024-3-30 19:23:13

    可以这样(实际一维做法)

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    #define int long long
    #define endl '\n'
    #define QAQ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    using namespace std;
    const int N=1e3+5;
    int a[N],sum[N][N]={0};
    void solve()
    {
        int n,m,q;
        cin>>n>>m>>q;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int x;
                cin>>x;
                sum[i][j]=sum[i][j-1]+x;//第i行的前j列的和//每一行求一维前缀和
            }
        }
        while(q--)
        {
            int x1,y1,x2,y2;
            cin>>x1>>y1>>x2>>y2;
            int summ=0;
            for(int i=x1;i<=x2;i++)
            {
                summ+=sum[i][y2]-sum[i][y1-1];//x1到x2每一行里面 y1到y2的和加起来得到总共的
            }
            cout<<summ<<endl;
        }
        
        
        
    }
    signed main()
    {
        QAQ;
        int t=1;
    //    cin>>t;
        while(t--)
            solve();
        
        
        return 0;
    }
    ​
    

    也可以(二维)

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    #define int long long
    #define endl '\n'
    #define QAQ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    using namespace std;
    const int N=1e3+5;
    int a[N],sum[N][N]={0};
    void solve()
    {
        int n,m,q;
        cin>>n>>m>>q;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int x;
                cin>>x;
                sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+x;//上面的矩阵加上左边的矩阵再减去他们重复部分,最后加上(i,j)位置的数就可以得到(1,1)到(i,j)的和
            }
        }
        while(q--)
        {
            int x1,y1,x2,y2;
            cin>>x1>>y1>>x2>>y2;//求(x1,y1)到(x2,y2)之间的值
            int summ=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];
            //(x2,y2)的前缀和减去(x2,y1)的左边部分再减去(x1,y2)的上边部分+多减去的重复部分也就是(x1,y1)左上角部分  就得到了所求部分
            cout<<summ<<endl;
        }
        
        
        
    }
    signed main()
    {
        QAQ;
        int t=1;
    //    cin>>t;
        while(t--)
            solve();
        
        
        return 0;
    }
    ​
    

    看不懂可以画图理解一下

    • 1

    Information

    ID
    6680
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    3
    Tags
    (None)
    # Submissions
    64
    Accepted
    37
    Uploaded By