可以利用字首和解決用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'>輸入樣例:
5321364
1213
24
輸出樣例:
3610
**實現:
#includeusingnamespace
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
'>輸入樣例:
3431724
3628
2123
1122
2134
1334
輸出樣例:
172721
**實現:
#includeusingnamespace
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 ...