【HDU】1166敵兵佈陣-(線段樹入門)
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);
}
}
}