敵兵布陣 線段樹 HDU 1166

2022-06-27 19:54:10 字數 1973 閱讀 3654

乙個人養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...