Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 127636 Accepted Submission(s): 53484 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 Author Windbreaker Recommend Eddy | We have carefully selected several similar problems for you: 1394 1698 1754 1542 1540 |
线段树基础入门题目,附上一篇觉得写得特好的博文吧
https://blog.csdn.net/zearot/article/details/48299459#t2
感谢大佬!!
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=50000+5;
int sum[maxn*4];
void pushup(int x)
{
sum[x]=sum[x*2]+sum[x*2+1];
}
void build(int i,int l,int r)
{
if(l==r)
{
scanf("%d",&sum[i]);
return ;
}
int m=(r+l)/2;
build(i*2,l,m);
build(i*2+1,m+1,r);
pushup(i);
}
void update(int id,int val,int i,int l,int r)
{
if(r==l)
{
sum[i]+=val;
return ;
}
int m=(l+r)/2;
if(id<=m) update(id,val,i*2,l,m);
else update(id,val,i*2+1,m+1,r);
pushup(i);
}
int query(int L,int R,int i,int l,int r)
{
if(L<=l&&r<=R)
{
return sum[i];
}
int m=(r+l)/2;
int res=0;
if(L<=m) res+=query(L,R,i*2,l,m);
if(m<R) res+=query(L,R,i*2+1,m+1,r);
return res;
}
int main()
{
int T;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
printf("Case %d:\n",kase);
int n;
scanf("%d",&n);
build(1,1,n);
char str[20];
int u,v;
while(scanf("%s",str)==1&&str[0]!='E')
{
scanf("%d%d",&u,&v);
if(str[0]=='Q') printf("%d\n",query(u,v,1,1,n));
else if((str[0]=='A')) update(u,v,1,1,n);
else update(u,-v,1,1,n);
}
}
}