zoukankan      html  css  js  c++  java
  • 二维前缀和

    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('
    ');
        }
        return 0;
    }
  • 相关阅读:
    Swift3.0 数组(Array)
    Swift3.0 UICollectionView简单使用
    Swift3.0 字符串(string)
    Swift3.0 元组 (tuples)
    Swift3.0 UICollectionView 删除,拖动
    Swift3.0 控制流
    Swift3.0 UITextView写反馈界面
    HashMap JDK1.8实现原理
    Volatile的详解
    阻塞队列之LinkedBlockingQueue
  • 原文地址:https://www.cnblogs.com/pprp/p/7439875.html
Copyright © 2011-2022 走看看