您的位置:首页 > 其它

hdu 1166 敌兵布阵

2013-06-02 22:59 260 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

树状数组:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 50050;

int tree[4*maxn];
int a[maxn];
int n,T;
char ch[10];

void build(int u,int l,int r){
if(l == r){
tree[u] = a[l];
return;
}
int mid = (l + r)>>1;
build(2*u,l,mid);
build(2*u+1,mid+1,r);
tree[u] = tree[2*u] + tree[2*u+1];
}
void update(int u,int l,int r,int goal,int num){
if(l == r){
tree[u] += num;
return;
}
int mid = (l+r)/2;                      //printf("%d %d %d\n",l,r,mid);
if(goal <= mid)     update(2*u,l,mid,goal,num);
else                update(2*u+1,mid+1,r,goal,num);
tree[u] = tree[2*u] + tree[2*u+1];  //printf("tree %d %d         %d %d         %d\n",u,tree[u] ,2*u,tree[2*u] ,tree[2*u+1]);
}
int query(int u,int l,int r,int tl,int tr){
if(tl<=l && r<=tr){
return tree[u];
}
int mid = (l + r)/2;
if(tr <= mid)       return query(2*u,l,mid,tl,tr);
else if(tl > mid)   return query(2*u+1,mid+1,r,tl,tr);
else                 return query(2*u,l,mid,tl,tr)+query(2*u+1,mid+1,r,tl,tr);

}
int main()
{
//if(freopen("input.txt","r",stdin)== NULL)  {printf("Error\n"); exit(0);}
cin>>T;
for(int t=1;t<=T;t++){
cin>>n;
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++) cin>>a[i];

int tl,tr;
build(1,1,n);
printf("Case %d:\n",t);
cin>>ch;
while(strcmp(ch,"End")){
if(!strcmp(ch,"Query")){
scanf("%d%d",&tl,&tr);
int ans = query(1,1,n,tl,tr);
printf("%d\n",ans);
}
else if(!strcmp(ch,"Add")){
int a,b;
scanf("%d%d",&a,&b);
update(1,1,n,a,b);
}
else if(!strcmp(ch,"Sub")){
int a,b;
scanf("%d%d",&a,&b);
update(1,1,n,a,-b);
}
scanf("%s",ch);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: