字首和 差分 位運算 雙指標

2022-05-29 13:30:26 字數 1957 閱讀 8840

可以利用字首和解決用o(n)的時間複雜度求出一段序列的某一段區間的和。

s[i] = a[1] + a[2] +... a[i]

a[l] + ... + a[r] = s[r] - s[l - 1]

例題輸入乙個長度為n的整數序列。

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

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

輸入格式

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

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

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

輸出格式

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

資料範圍1≤

l≤r≤

n'>1≤l≤r≤n1≤l≤r≤n,1≤

n,m≤

100000

'>1≤n,m≤1000001≤n,m≤100000,

−1000≤數

列中元素

的值≤1000

'>−1000≤數列中元素的值≤10001≤

l≤r≤

n'>輸入樣例:

532

1364

1213

24

輸出樣例:

3

610

**實現:

#includeusing

namespace

std;

const

int n=100010

;int

a[n],s[n];

intmain()

}

s[i, j] =第i行j列格仔左上部分所有元素的和

以(x1, y1)為左上角,(x2, y2)為右下角的子矩陣的和為:

s[x2, y2] - s[x1 - 1, y2] - s[x2, y1 - 1] + s[x1 - 1, y1 - 1

]根據矩陣求取字首和

s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]

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

對於每個詢問輸出子矩陣中所有數的和。

輸入格式:

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

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

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

輸出格式:

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

資料範圍:1≤

n,m≤

1000

'>1≤n,m≤10001≤n,m≤1000,1≤

q≤200000

'>1≤q≤2000001≤q≤200000,1≤

x1≤x

2≤n'>1≤x1≤x2≤n1≤x1≤x2≤n,1≤

y1≤y

2≤m'>1≤y1≤y2≤m1≤y1≤y2≤m,

−1000≤矩

陣內元素

的值≤1000

'>−1000≤矩陣內元素的值≤10001≤

n,m≤

1000

'>輸入樣例:

343

1724

3628

2123

1122

2134

1334

輸出樣例:

17

2721

**實現:

#includeusing

namespace

std;

const

int n=1010

;int

s[n][n],a[n][n];

intn,m,q;

intmain()

}

雙指標 位運算

乙個開頭 乙個結尾 乙個開頭 乙個中間 劃分為兩部分 for i 0,j 0 i n i for int i 0 i n i for int j 0 j n j o n 2 將上面bf演算法優化到o n 將空格分割的單詞提取出來 include include using namespace std...

字首和 差分

數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...

字首和 差分

有n個數和q次操作,每一次操作指明了要操作的區間 l,r 以及讓該區間內的所有元素全部加c 輸出q次操作後所有元素的大小 第一行 n q 1 n,q 2 105 第二行 n個數 a1,a2 an 106 ai 106 接下來q 行 每行3個數 l r c 表示 l,r 區間內每個數加c 1 l r ...