hdoj_1166_敌兵布阵_树状数组

树状数组 模板题对待就好

hdoj_1166_敌兵布阵_树状数组

据图可知:

c1=a1,

c2=a1+a2,

c3=a3,

c4=a1+a2+a3+a4,

c5=a5,c6=a5+a6,

c7=a7,

c8=a1+a2+a3+a4+a5+a6+a7+a8,

c9=a9,

c10=a9+a10,

c11=a11

........

c16=a1+a2+a3+a4+a5+.......+a16。


基础题

#include <stdio.h>
#include <string.h>
int T, K, n, a[50010], x, y, ans, val;
char s[10];

int lowbit(int i){
	return i&(-i);
}
void update(int i, int val){
	while(i<=n){
		a[i] += val;
		i += lowbit(i);
	}
}
int sum(int i){
	int sum =0;
	while(i > 0){
		sum += a[i];
		i -= lowbit(i);
	}
	return sum;
}
int 
main()
{
	scanf("%d", &T);
	while(1){
		K=1;
		printf("Case %d:\n", K++);
		
		memset(a, 0, sizeof(a));
		scanf("%d", &n);
		for(int i=1; i<=n; i++){
			scanf("%d", &val);
			update(i, val);
		}
		while(scanf("%s", s)){
			if(strcmp(s,"End")==0){
				break;
			}
			scanf("%d %d", &x, &y);
			if(strcmp(s, "Add")==0){
				update(x, y);
			}
			if(strcmp(s, "Sub")==0){
				update(x, -y);
			}
			if(strcmp(s, "Query")==0){
				ans=sum(y)-sum(x-1);
				printf("%d\n", ans);
			}
		}
	}
	return 0;
}


你可能感兴趣的:(hdoj_1166_敌兵布阵_树状数组)