前綴和

前綴和

一維前綴和

Skips

  • 快速計算一個區間內數的和 [l,r]ios

  • 定義一個數組 ,下標要從1 開始 ,邊界值 定義 s[0]=0 (若是是全局變量 的 數組 沒必要再 初始化,若不是 記得初始化s[0]=0),記錄 s[i] 爲 數組 a 中第 i個數以前全部數的和c++

  • ```s[i] = s[i-1] + a[i];// 遞推公式 這裏面有 i-1 因此 當 l=1 的時候 (就是從第一個數開始算的話)`下標會爲 i-1 那麼i-1 就得是 0 否則數就不對 ``數組

  • 具體計算 使用 是 s[r]-s[l-1] 由於 s[]數組記錄的是 多少個數 的和 相減 正好剩下 兩個下標相差的值 注意這裏是 l-1 若是是 l 的話那麼 剪完以後是 s[l+1] 到 s[r] 的值 中間a[l] 的spa

    在兩個前綴裏面都有,就被減掉了。.net

模板題

輸入一個長度爲n的整數序列。code

接下來再輸入m個詢問,每一個詢問輸入一對l, r。blog

對於每一個詢問,輸出原序列中從第l個數到第r個數的和。ip

輸入格式ci

第一行包含兩個整數n和m。get

第二行包含n個整數,表示整數數列。

接下來m行,每行包含兩個整數l和r,表示一個詢問的區間範圍。

輸出格式

共m行,每行輸出一個詢問的結果。

數據範圍

1≤l≤r≤n1≤l≤r≤n,
1≤n,m≤1000001≤n,m≤100000,
−1000≤數列中元素的值≤1000−1000≤數列中元素的值≤1000

輸入樣例:

5 3
2 1 3 6 4
1 2
1 3
2 4

輸出樣例:

3
6
10

代碼

#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],s[N];    // s[0]=0;
int n,m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i]; //數組 a存完以後 在 存s數組 
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; // 遞推公式
    while(m--)
    {
        int l,r;
        cin>>l>>r;
        cout<<s[r]-s[l-1]<<endl; // 輸出的時候下標 右端點 數值 減一 
    }
    
    
    return 0;
}

二維前綴和

Skips

  • 應用:

    • 給出一個座標,求出 以 該座標爲右下角的矩陣的元素的和
    • 給出兩個座標,求出 以 小的座標爲 左上角,大的座標爲右上角 的矩陣元素的和
  • 核心

    1. 第一個應用 : 求和 的具體操做

      // 利用了容斥原理 經過 分塊的思想
      // 先讀入元素
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>a[i][j];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
      /* 核心*/ s[i][j]= s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
      // 加的時候 多加的 要減去  不要忘了 a[i][j]
    2. 第二個應用: 作差 的具體操做

      int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl;
      // 減的時候多 減了要加回來     
          
          
          
          return 0;

模板題

輸入一個n行m列的整數矩陣,再輸入q個詢問,每一個詢問包含四個整數x1, y1, x2, y2,表示一個子矩陣的左上角座標和右下角座標。

對於每一個詢問輸出子矩陣中全部數的和。

輸入格式

第一行包含三個整數n,m,q。

接下來n行,每行包含m個整數,表示整數矩陣。

接下來q行,每行包含四個整數x1, y1, x2, y2,表示一組詢問。

輸出格式

共q行,每行輸出一個詢問的結果。

數據範圍

1≤n,m≤10001≤n,m≤1000,
1≤q≤2000001≤q≤200000,
1≤x1≤x2≤n1≤x1≤x2≤n,
1≤y1≤y2≤m1≤y1≤y2≤m,
−1000≤矩陣內元素的值≤1000−1000≤矩陣內元素的值≤1000

輸入樣例:

3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4

輸出樣例:

17
27
21

代碼

#include<iostream>
using namespace std;
const int N=1e3+10;
int a[N][N],s[N][N];
int n,m,q;
int main()
{
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
           s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
            
    while(q--)
    {
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl;
    }
        
    
    
    
    return 0;
}
相關文章
相關標籤/搜索