HDOJ1698解題報告 線段樹模板

2022-03-01 11:16:41 字數 1876 閱讀 1387

題目概述:

一段區間從1~n,每次操作將某一段全部改為x,操作完成後求整個區間和。

大致思路:

典型的乙個rmq模板題。只需要注意add操作裡pushdown的+=改成=就可以了。

還有注意在build_tree的時候初始化整棵樹!!!

還有注意在build_tree的時候初始化整棵樹!!!

還有注意在build_tree的時候初始化整棵樹!!!

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11

using

namespace

std;

1213

#define sacnf scanf

14#define scnaf scanf

15#define maxn 100010

16#define maxm 26

17#define inf 1061109567

18#define eps 0.001

19const

double pi=acos(-1.0

);20

#define mod 1000000007

21#define maxnum 10000

22void swap(int &a,int &b)

23int abs(int x)

24 typedef long

long

ll;25 typedef unsigned int

uint;26

27struct

node

28 tree[4*maxn];

3132

void build_tree(int l,int r,int

dir)

3340

int m=(l+r)>>1

;41 build_tree(l,m,dir*2

);42 build_tree(m+1,r,dir*2+1

);43 tree[dir].val=tree[dir*2].val+tree[dir*2+1

].val;44}

4546

void push(int l,int r,int

dir)

4755}56

57void modify(int l,int r,int dir,int ql,int qr,int

c)58

66push(l,r,dir);

67int m=(l+r)>>1

;68 modify(l,m,dir*2

,ql,qr,c);

69 modify(m+1,r,dir*2+1

,ql,qr,c);

70 tree[dir].val=tree[dir*2].val+tree[dir*2+1

].val;71}

7273

intmain()

7490 printf("

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

",kase,tree[1

].val);91}

92//

clock_t ed=clock();

93//

printf("\n\ntime used : %.5lf ms.\n",(double)(ed-st)/clocks_per_sec);

94return0;

95 }

線段樹成段更新 hdoj 1698

題意 對乙個線段上的值進行修改,一次可以把 i,j 這個區間上的值改為1,2,或3。1 n這個區間上數字的和 思路 一道很加深對成段更新理解的題目,需要成段更新加上一點技巧具體見 update include include includeusing namespace std const int ...

HDOJ 1698 區間更新

include include include include include using namespace std define lson l m rt 1 define rson m 1,r rt 1 1 寫下自己對區間操作的一些理解,首先全部的資料都是儲存在sum rt 中的,可是如何理解這...

HDOJ5692解題報告 dfs序 線段樹

題目概述 中文題面就不贅述了。大致思路 這個題給出的是一棵樹,我們可以使用dfs序將這棵樹處理成一條鏈,然後對這條鏈來進行資訊維護和查詢。有兩種操作,0 x是詢問從0出發 題目保證0為樹根 經過x的路徑中的最大權值,1 x y是將點x的權值修改成y,這時我們用線段樹來維護乙個d i 表示點i到0點的...