數列操作

貓的旅途發表於2020-10-07

測試地址:

【題目描述】

給定 n 個數列,規定有兩種操作,一是修改某個元素,二是求子數列 [a,b] 的連續和。數列元素個數最多10 萬個,詢問操作最多1010萬次。

【輸入】

第一行 2 個整數 n,m ( n 表示輸入 n 個數,m 表示 m 操作)

第二行 n 個整數

接下來 m 行,每行三個數 k,a,b ( k=0 ,表示求子數列 [a,b] 的連續和;k=1,表示第 a 個數加 b)。

【輸出】

若干行,表示 k=0 時,對應子數列 [a,b] 連續和。

【輸入樣例】

10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8

【輸出樣例】

11
30
35

【思路】

一道模板題,直接套用即可,可參考 樹狀陣列 

【AC程式碼】

#include<cstdio>
const int maxn=1e6+7;
int c[maxn];	
int n, m, x;
int Lowbit(int x){
	return x&(-x);
}
void update(int x, int y){
	for(int i = x; i <= n; i+=Lowbit(i))
		c[i] += y;
}
int sum(int x){
	int sumn=0;
	for(int i = x; i > 0; i-=Lowbit(i))
		sumn += c[i];
	return sumn;
}
int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++){
		scanf("%d", &x);
		update(i, x);
	} 
	while(m--){
		int k, a, b;
		scanf("%d%d%d", &k, &a, &b);
		if(k == 1){
			update(a, b);
		}
		else{
			printf("%d\n", sum(b)-sum(a-1));
		}
	}
	return 0;
} 

 

相關文章