题意:题目是中文的,应该都能理解吧
注意:输入输出的时候尽量用 scanf 和 printf ,我用的 cin 和 cout ,超时好多遍,最后涂涂改改以988msAC,内心是崩溃的。
然后贴上代码吧
#include <bits/stdc++.h>
using namespace std;
const int maxn=50010;
struct node
{
int l,r,num;
} tree[4*maxn];
int ans[maxn]; //存放每个营地的初始士兵数量
void buildtree(int left,int right,int u) //建树
{
tree[u].l=left;
tree[u].r=right;
if(left==right)
{
tree[u].num=ans[left];
return;
}
int mid=(left+right)>>1;
buildtree(left,mid,u<<1);
buildtree(mid+1,right,(u<<1)+1);
tree[u].num=tree[u<<1].num+tree[(u<<1)+1].num; //线段内的士兵数量
}
void Add(int u,int a,int b) //加法
{
tree[u].num+=b; //修改值
if(tree[u].l==tree[u].r)
return;
if(a<=tree[u<<1].r) //左子树包含 a
Add(u<<1,a,b);
else //右子树包含 a
Add((u<<1)+1,a,b);
}
int Query(int u,int a,int b)
{
if(a==tree[u].l&&b==tree[u].r) //区间刚好等于线段
return tree[u].num;
int mid=(tree[u].l+tree[u].r)>>1;
if(b<=mid) //区间仅在左子树
return Query(u<<1,a,b);
else if(a>mid) //区间仅在右子树
return Query((u<<1)+1,a,b);
else //左右子树都包含
return Query(u<<1,a,mid)+Query((u<<1)+1,mid+1,b);
}
int main()
{
int T,n,a,b;
string s;
cin>>T;
for(int t=1; t<=T; t++)
{
cout<<"Case "<<t<<':'<<endl;
cin>>n;
for(int i=1; i<=n; i++)
cin>>ans[i];
buildtree(1,n,1);
while(cin>>s)
{
if(s=="End")
break;
cin>>a>>b;
if(s=="Add")
Add(1,a,b);
else if(s=="Sub")//减法就是加上了个负数,不用再写个减法的函数
Add(1,a,-b);
else
cout<<Query(1,a,b)<<endl;
}
}
return 0;
}