【HDU1166】敌兵布阵-单点修改和区间求和

来源:互联网 发布:盈利宝 知乎 编辑:程序博客网 时间:2024/06/11 10:57

题目大意:一个长为N的数列A,对它进行操作:1.Add/Sub i j:将Ai增加/减去j。2.Query i j:询问Ai+...+Aj的值。对于每个询问,给出正确的答案。

做法:一道入门题,用线段树和树状数组都能做,比较简单。

因为树状数组编程复杂度比较低,所以这里只贴树状数组的代码:

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int T,n,c[50010]={0};char op[10]={0};int lowbit(int i){  return i&(-i);}void add(int x,int a){  for(int i=x;i<=n;i+=lowbit(i))    c[i]+=a;}int sum(int x){  int s=0;  for(int i=x;i>0;i-=lowbit(i))    s+=c[i];  return s;}int query(int a,int b){  return sum(b)-sum(a-1);}int main(){  scanf("%d",&T);  for(int t=1;t<=T;t++)  {    scanf("%d\n",&n);memset(c,0,sizeof(c));for(int i=1;i<=n;i++){  int a;  scanf("%d",&a);  if (i==n) scanf("\n");  add(i,a);}printf("Case %d:\n",t);scanf("%s",op);while(op[0]!='E'){  int a,b;  scanf("%d %d\n",&a,&b);  if (op[0]=='A') add(a,b);  if (op[0]=='S') add(a,-b);  if (op[0]=='Q') printf("%d\n",query(a,b));  scanf("%s",op);}  }    return 0;}



0 0