敌兵布阵Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。
Input 第一行一个整数T,表示有T组数据。
Output 对第i组数据,首先输出“Case i:”和回车,
Sample Input 1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Sample Output Case 1: 6 33 59 |
模板题,树状数组,留档 emmm
#include<bits/stdc++.h>
using namespace std;
#define long long LL
/** 树状数组 */
int s[50005],m;
int lowbit(int x) //2^k
{
return x&(-x);
}
int sum(int x) //求和
{
int ans=0;
while(x>0)
{
ans = ans + s[x];
x = x - lowbit(x);
}
return ans;
}
void update(int pos,int delta) //更新
{
while(pos<=m)
{
s[pos] = s[pos] + delta;
pos = pos + lowbit(pos);
}
}
int main()
{
int n;
cin>>n;
for(int ii=1;ii<=n;ii++)
{
cin>>m;
printf("Case %d:\n",ii);
memset(s,0,sizeof(s));
for(int i=1;i<=m;i++)
{
int xx;
cin>>xx;
update(i,xx);
}
string ask;
int a,b;
while(cin>>ask)
{
if(ask[0]=='E') break;
cin>>a>>b;
if(ask[0]=='Q')
printf("%d\n",sum(b)-sum(a-1));
else if(ask[0]=='A')
update(a,b);
else if(ask[0]=='S')
update(a,-b);
}
}
return 0;
}