乙個人養lyd,每盆lyd都有乙個價值,lyd是排成一行。有三個操作:有時某盆lyd的價值會上公升,有時某盆lyd的價值會下降。有時他想知道某段連續的lyd的價值之和是多少,你能快速地告訴她結果嗎?
第一行乙個整數t,表示有t組測試資料。每組測試資料的第一行為乙個正整數n (n<=50000),表示有n盆lyd。
接下來有n個正整數,第i個正整數a表示第i盆lyd的初始價值。
接下來每行有一條命令,命令有4種形式:(1)add i j, i和j為正整數,表示第i盆lyd價值增加j (j<=30)
(2)sub i j, i和j為正整數,表示第i盆lyd價值減少j (j<=30)
(3)query i j, i和j為正整數,i<=j,表示詢問第i盆lyd到第j盆lyd的價值之和
(4)end,表示結束,這條命令在每組資料最後出現
每組資料的命令不超過40000條
#define _crt_secure_no_warnings#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define inf 1<<30
#define eps 1e-7
#define ld long double
#define ll long long
#define maxn 100000005
struct
node
tree[maxn];
int num[maxn] ={};
void update(int
step)
void buildtree(int step,int l,int r)//
先把樹建了
int mid = (l + r) >> 1
; buildtree(step
<< 1
, l, mid);//建左子樹
buildtree(step
<< 1 | 1, mid + 1
, r);//建右子樹
update(step);
}void change(int step, int l, int r, int val)//
對樹進行修改
int mid = (tree[step].l + tree[step].r) >> 1
;
if (r <= mid)//
要修改的點在左子樹時
change(step * 2
, l, r, val);
else
//要修改的點在右子樹時
change(step * 2 + 1
, l, r, val);
update(step);
//對所有包含修改點的樹進行修改
}int query(int step, int l, int r)//
求部分範圍之和
intmain()
buildtree(
1, 1
, n);
printf(
"case %d:\n
", case++);//
格式while (cin >>s)
else
if (s == "
add"
)
else
if (s == "
sub"
)
else
if (s == "
query")}}
}
HDU 1166 敵兵布陣 線段樹
第一道線段樹的題目,正在學習中 include include include using namespace std define max 55555 int sum max 2 n void pushup int rt void build int l,int r,int rt int mid ...
hdu1166敵兵布陣 線段樹
problem description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的...
A 敵兵布陣 線段樹 hdu 1166
a 敵兵布陣 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u submit status practice hdu 1166 description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek...