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 |
这道题是个线段树&树状数组模板题
我用的树状数组,,太蠢了,,因为数组没有初始化,wa了好几次才发现
#include<bits/stdc++.h>
using namespace std;
int c[100000];
int n;
int lowbit(int x)
{
return x&(-x);
}
void update(int i,int val)
{
while(i<=n)
{
c[i]+=val;
i+=lowbit(i);
}
}
int sum(int i)
{
int ans=0;
while(i>0)
{
ans+=c[i];
i-=lowbit(i);
}
return ans;
}
int main()
{
int cnt=1;
int t;scanf("%d",&t);
while(t--)
{
memset(c,0,sizeof(c));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a;scanf("%d",&a);
update(i,a);
}
printf("Case %d:\n",cnt++);
char ch[10];
while(~scanf("%s",ch))
{
if(ch[0]=='E')
break;
else if(ch[0]=='Q')
{
int i,j;
scanf("%d %d",&i,&j);
printf("%d\n",sum(j)-sum(i-1));
}
else if(ch[0]=='A')
{
int i,j;
scanf("%d %d",&i,&j);
update(i,j);
}
else {
int i,j;
scanf("%d %d",&i,&j);
update(i,-j);
}
}
}
return 0;
}