您的位置:首页 > 其它

敌兵布阵

2016-04-21 11:11 316 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1166

#include <iostream>

#include<cstdio>

using namespace std;

struct soldier

{
int left;
int right;
int num;

}tree[150010];

void build(int left,int right,int x)

{
tree[x].left=left;
tree[x].right=right;
if(left==right)
{
scanf("%d",&tree[x].num);
return;
}
int mid=(left+right)>>1;
build(left,mid,x<<1);
build(mid+1,right,x<<1|1);
tree[x].num=tree[x<<1].num+tree[x<<1|1].num;

}

void add(int id,int num,int x)

{
if(tree[x].left==tree[x].right)
{
tree[x].num+=num;
return;
}
tree[x].num+=num;
if(id<=tree[x<<1].right)
add(id,num,x<<1);
else
add(id,num,x<<1|1);

}

int query(int left,int right,int x)

{
if(tree[x].left==left && tree[x].right==right)
return tree[x].num;
int treemid=(tree[x].left+tree[x].right)>>1;
if(right<=treemid)
return query(left,right,x<<1);
if(left>treemid)
return query(left,right,x<<1|1);
return query(left,treemid,x<<1)+query(treemid+1,right,x<<1|1);

}

int main()

{
int T;
cin>>T;
int n,i,j,k;
char ch[20];
for(k=1;k<=T;k++)
{
cout<<"Case "<<k<<":"<<endl;
scanf("%d",&n);
build(1,n,1);
while(cin>>ch)
{
if(ch[0]=='E')
break;
else if(ch[0]=='Q')
{
int left,right;
cin>>left>>right;
printf("%d\n",query(left,right,1));
}
else if(ch[0]=='A')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num,1);
}
else if(ch[0]=='S')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num*(-1),1);
}
}
}
return 0;
}

////////////////////////////////////////////////////////////////////////

#include <iostream>

#include<cstdio>

#include<cstring>

using namespace std;

int a[50010],b[50010],n;

void add(int k,int num)

{
while(k<=n)
{
b[k]+=num;
k+=k&-k;
}

}

int getSum(int k)

{
int sum=0;
while(k>0)
{
sum+=b[k];
k-=k&-k;
}
return sum;

}

int main()

{
int T;
cin>>T;
int i,j,k;
char ch[20];
for(k=1;k<=T;k++)
{
cout<<"Case "<<k<<":"<<endl;
memset(b,0,sizeof(b));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",a+i);
add(i,a[i]);
}
while(cin>>ch)
{
if(ch[0]=='E')
break;
else if(ch[0]=='Q')
{
int left,right;
scanf("%d%d",&left,&right);
printf("%d\n",getSum(right)-getSum(left-1));
}
else if(ch[0]=='A')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num);
}
else if(ch[0]=='S')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,-num);
}
}

return 0;

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