nyoj123 士兵殺敵(四) 樹狀數組之插線問點

原題鏈接:nyoj123 士兵殺敵(四)

用線段樹超時了,用樹狀數組過了

#include <cstdio>
using namespace std;
#define lowbit(i) i & -i
const int MAX_M = 1000000 + 1;
int T, M;
int bit[MAX_M];
void add(int i, int x){
	while(i <= M){
		bit[i] += x;
		i += i & -i; 
	}
}
int sum(int i){	//sum(i)代表第1到i項的和 
	int s = 0;
	while(i > 0){
		s += bit[i];
		i -= i & -i;
	}
	return s;
}
int main(){
	char s[6];
	int l, r, x;
	scanf("%d%d", &T, &M);
	for(int i = 0;i < T;i ++){
		scanf("%s", s);
		if(s[0] == 'A'){
			scanf("%d%d%d", &l, &r, &x);
			add(l, x);
			add(r + 1, -x); //第l個加x,第r+1個加-x
			//第l項加x 對於sum來說相當於l到M所有的項都加x
			//同理,第r+1項加-x 對於sum來說相當於r+1到M所有的項都加-x 
			//兩個操作對sum來說相當於第l到r項都加上x,於是sum(l到r)存的也都x,即是那一項的值 
		} else { 
			scanf("%d", &l);
			printf("%d\n", sum(l));
		}
	}
	return 0;
} 

發佈了100 篇原創文章 · 獲贊 71 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章