二维前缀和 - 算法学习 - 输入输出优化

Posted pprp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维前缀和 - 算法学习 - 输入输出优化相关的知识,希望对你有一定的参考价值。

2017-08-27 11:11:38

writer:pprp

二维前缀和主要用到了容斥定理,具体实现还是有点复杂的

详见代码:

/*
@theme:二维前缀和
@writer:pprp
@declare:用到容斥定理
@date:2017/8/27
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1010;

int n, m, a[maxn][maxn];

//输入优化
inline int read()
{
    int X=0,w=1;
    char ch=0;
    while(ch<0 || ch>9)
    {
        if(ch==-) w=-1;
        ch=getchar();
    }
    while(ch>=0 && ch<=9) X=(X<<3)+(X<<1)+ch-0,ch=getchar();
    return X*w;
}

inline void write(int x)
{
    if(x<0) putchar(-),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+0);
}

int main()
{
    freopen("in.txt","r",stdin);
    n = read();
    m = read();
    a[0][0] = read();

    //前n向子矩阵和的求法
    for(int i = 1; i < n ; i++)
    {
        a[0][i] = read();
        a[0][i] += a[0][i-1];
    }
    //这段的实现比较复杂
    for(int i = 1; i < n ; i++)
    {
        a[i][0] = read();
        a[i][0] += a[i-1][0];
        for(int j = 1; j < n ; j++)
        {
            a[i][j] = read();
            //容斥原理
            a[i][j] = a[i][j] + a[i-1][j] + a[i][j-1] - a[i-1][j-1];
        }
    }

    for(int i = 0 ; i < m ; i++)
    {
        int x, y, x1, y1;
        x = read();
        y = read();
        x1 = read();
        y1 = read();
        //write(a[x1-1][y1-1]-a[x-2][y1-1]-a[x1-1][y-2]+a[x-2][y-2]);
        //如果这样写就有问题了,因为如果考虑边界情况,在x = 1||y = 1的时候,会减去a[x1-1][-1],减去不存在的数
        //所以需要判断四种情况
        if(x==1 && y==1)
        {
            write(a[x1-1][y1-1]);
        }
        else if(x==1)
        {
            write(a[x1-1][y1-1]-a[x1-1][y-2]);
        }
        else if(y==1)
        {
            write(a[x1-1][y1-1]-a[x-2][y1-1]);
        }
        else
        {
            write(a[x1-1][y1-1]-a[x-2][y1-1]-a[x1-1][y-2]+a[x-2][y-2]);//输出结果,单次O(1),总共O(m)
        }
        putchar(\n);
    }
    return 0;
}

 

以上是关于二维前缀和 - 算法学习 - 输入输出优化的主要内容,如果未能解决你的问题,请参考以下文章

一维前缀和 - 包含输入输出优化

算法796. 子矩阵的和——二维前缀和

leetcode_1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold_[二维前缀和](代码片段

片段(Java) | 机试题+算法思路+考点+代码解析 2023

二维前缀和模板题

LuoguP2822 组合数问题(组合数,二维前缀和)