hdu1166敵兵佈陣 樹狀數組裸題

樹狀數組裸題

動態更新區間內的點,動態查詢區間和
敵兵佈陣
ac代碼

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
const int maxn=5e4+10;
int T,n,a[maxn];


//樹狀數組前驅和後繼
int lowbit(int x){
	return x&-x; 
}

//樹狀數組更新
void add(int i,int k){
	while(i<=n){
		a[i]+=k;
		i+=lowbit(i);
	}
}

//樹狀數組前綴和
int sum(int i){
	int ans=0;
	while(i>0){
		ans+=a[i];
		i-=lowbit(i);
	}
	return ans;
}


int main(){

	int cnt=1;
	string s;//輸入第一位
	int l,r,result;
	cin>>T;
	while(T--){
		memset(a,0,sizeof(a));//記得清零
		cin>>n;
		int tmp;
		for(int i=1;i<=n;i++){
			cin>>tmp;
			add(i,tmp);//加入樹狀數組 
		}
		printf("Case %d:\n",cnt++);//cnt++先用後++
		
		while(cin>>s&&s!="End"){//輸入東西,東西不等於end 
			cin>>l>>r;
			if(s=="Add"){
				add(l,r);
			}
			else if(s=="Sub")
				add(l,-r);//負的add
			else if(s=="Query"){
				result=sum(r)-sum(l-1);
				cout<<result<<endl;
			}
			
		}
		
	}
	
	
	return 0;
	
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章