生活随笔
收集整理的這篇文章主要介紹了
HDOJ1166 敌兵布阵【线段树】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
Problem : 1166 ( 敵兵布陣 ) ????Judge Status : Accepted
RunId : 5862942????Language : GCC????Author : qq1203456195
#include <stdio.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 55555
int sum[maxn<<
2];
void PushUp(
int rt)
{sum[rt]=sum[rt<<
1]+sum[rt<<
1|
1];
}
void build(
int l,
int r,
int rt)
{int m;if (l==
r){scanf("%d",&
sum[rt]);return;}m=((l+r)>>
1);build(lson);build(rson);PushUp(rt);
}
void update(
int p,
int add,
int l,
int r,
int rt)
{int m;if (l==
r){sum[rt]+=
add;return;}m=((l+r)>>
1);if (p<=
m)update(p,add,lson);elseupdate(p,add,rson);PushUp(rt);
}
int query(
int L,
int R,
int l,
int r,
int rt)
{int m,ret=
0;if (L<=l&&R>=
r){return sum[rt];}m=((l+r)>>
1);if (L<=
m)ret+=
query(L,R,lson);if (R>
m)ret+=
query(L,R,rson);return ret;
}
int main()
{int T,n,cas;char op[
10];int a,b;scanf("%d",&
T);for (cas=
1;cas<=T;cas++
){printf("Case %d:\n",cas);scanf("%d",&
n);build(1,n,
1);while (scanf(
"%s",op)){if (op[
0]==
'E')break;scanf("%d%d",&a,&
b);if(op[
0]==
'Q')printf("%d\n",query(a,b,
1,n,
1));elseif(op[
0]==
'S')update(a,-b,
1,n,
1);elseupdate(a,b,1,n,
1);}}return 0;
} ?
轉載于:https://www.cnblogs.com/CheeseZH/archive/2012/04/28/2475493.html
總結
以上是生活随笔為你收集整理的HDOJ1166 敌兵布阵【线段树】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。