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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章