hdu1698 線段樹更新區間

2022-05-14 01:18:57 字數 1151 閱讀 3089

線段樹 更新整個區間

不要一直更新到節點,用乙個標記值-1標記是否雜色。

更新的時候如果該段正好是要更新的段則將其更新即可。

否則說明要更新的段與當前的tt[step]這一段不一致,則要將tt[step]這一段拆分成2段,遞迴呼叫更新step*2及step*2+1,更新後tt[step]將變成雜色。

所以將子段先賦予其父段tt[step]的顏色,並將tt[step]標記為雜色,在遞迴呼叫update。

1

//accepted 1698 406ms 3308k 1263 b c++ hujj

2 #include3 #include

4#define max 100010

5using

namespace

std;

6int

num[max];

7struct

segtree

814 }tt[max*3

];15

16void bulid(int s,int t,int

step)

1727

28void update(int a,int b,int x,int

step)

2936

if(tt[step].value!=-1)41

int mid=tt[step].calmid();

42if(a<=mid)

45if(b>mid)

46 update(a,b,x,step*2+1

);47}48

int query(int

step)

4954

//void print(int n)

55//

60int

main()

6172 printf("

case %d: the total value of the hook is %d.\n

",q,query(1

));

73//

cout<<"case "<74}75

return0;

76 }

hdu用c++編譯比用g++快很多,而且本題最好用scanf,可以快一倍的速度。

還有一種更快的做法,見帖子 

HDU 1698 線段樹區間更新

之前一直覺得自己線段樹敲得很熟練,然後。某天。是的,就是我的資料結構周開始的時候我發現。我特麼才會單點更新是怎麼回事!只會區間查詢是腫麼回事!摔!恩。就是表達一下弱渣的心情。區間更新,用到延遲操作。延遲操作應該是這麼回事。線段樹的優越性就是體現在,第一是二分查詢,第二是區間操作。當我們需要多次對區間...

hdu1698線段樹(區間更新)

題目鏈結just a hook 乙個鎖鏈,其組成成部分有三種材料,金銀銅,分數為3 2 1,每次可以更換一段的材料,求最後的分數 鉤子最多長100,000 操作最多有100,000次,肯定不能暴力 線段樹 延遲標記lazy 每個節點新增加乙個標記 lazy 每次要更新節點時,不更新到葉節點,記錄這個...

HDU 1698 線段樹(區間更新

題目鏈結 思路 今天才入門線段樹,一開始做這題還有一點懵,因為我開始的思路是區間更新時要考慮之前的狀態,比如之前的乙個需要更新的節點是鐵 1 現在再要求更新為鐵 1 則不進行更新.然後就要分很多情況去討論,很麻煩.所以另外想了乙個思路 受懶操作的啟發,我想我能不能定義乙個向下傳遞的值type 傳遞後...