当前位置: 代码迷 >> 综合 >> HDU 1166 敌兵布阵(树状数组入门题)
  详细解决方案

HDU 1166 敌兵布阵(树状数组入门题)

热度:76   发布时间:2024-01-22 01:54:08.0

题意:

单点add,区间sum

 

题解:

      线段树可以很好的写这个题,但是树状数组显得更加有效,快捷!


#include<bits/stdc++.h>using namespace std;
const int maxn = 50000+10;int c[maxn];
int lowbit(int x)
{return x & -x;
}int sum(int x)
{int res=0;while(x>0){res+=c[x];x-=lowbit(x);}return res;
}void add(int x,int v)
{while(x<maxn){c[x]+=v;x+=lowbit(x);}
}int main()
{int t;cin>>t;for(int kase=1;kase<=t;kase++){   printf("Case %d:\n",kase);int n;cin>>n;for(int i=0;i<n+10;i++)c[i] = 0;for(int i=1;i<=n;i++){int v;scanf("%d",&v);add(i,v);}char str[5];while(scanf("%s",str)){if(str[0] == 'E')break;else if(str[0] == 'Q'){int i,j;scanf("%d%d",&i,&j);printf("%d\n",sum(j)-sum(i-1) );}else if(str[0] == 'A'){int x,v;scanf("%d%d",&x,&v);add(x,v);}else{int x,v;scanf("%d%d",&x,&v);add(x,-v);}}}
}