線段樹模板 含區間最大 小 值

2022-05-16 22:48:10 字數 2530 閱讀 2407

線段樹,類似區間樹,它在各個節點儲存一條線段(陣列中的一段子陣列),主要用於高效解決連續區間的動態查詢問題,由於二叉結構的特性,它基本能保持每個操作的複雜度為o(l

ogn)

'>o(logn)

o(logn)。

1

const

int inf = 0x3f3f3f3f;2

const

int maxn = 50010;3

int a[maxn],ans[maxn<<2],lazy[maxn<<2];4

//a為原序列資訊,ans模擬線段樹維護區間和,lazy為懶惰標記

5int mx[maxn<<2],mn[maxn<<2];6

//mx區間最大值 mn區間最小值

1

void pushup(int

rt)2

1

void build(int l,int r,int

rt)2

8int mid = (l+r)>>1

;9 build(l,mid,rt<<1

);10 build(mid+1,r,rt<<1|1

);11

pushup(rt);

12 }

1

void pushdown(int rt,int ln,int

rn) 2//

ln表示左子樹元素結點個數,rn表示右子樹結點個數

316 }

1

void add(int l,int c,int l,int r,int

rt)2

8int mid = (l+r) >> 1

;9 pushdown(rt,mid-l+1,r-mid); //

若既有點更新又有區間更新,需要這句話

10//

什麼叫既有點更新又有區間更新???

11if(l <=mid)

12 add(l,c,l,mid,rt<<1

);13

else

14 add(l,c,mid+1,r,rt<<1|1

);15

pushup(rt);

16 }

1

void update(int l,int r,int c,int l,int r,int

rt)2

11int mid = (l+r)>>1

;12 pushdown(rt,mid-l+1,r-mid);

13if(l <=mid)

14 update(l,r,c,l,mid,rt<<1

);15

if(r >mid)

16 update(l,r,c,mid+1,r,rt<<1|1

);17

pushup(rt);

18 }

1 ll query(int l,int r,int l,int r,int

rt)2

9int mid = (l+r)>>1

;10 pushdown(rt,mid-l+1,r-mid); //

若更新只有點更新,不需要這句

11 ll ans = 0;12

//ll max = 0;

13//

ll min = inf;

14if(l <=mid)

1520

if(r >mid)

2126

//return max;

27//

return min;

28return

ans;

29 }

建樹b

uild

(1,n

,1);

'>bui

ld(1

,n,1

);'>build(1,n,1);

build(1,n,1);

點更新add

(l,c

,1,n

,1);

'>add(l,c,1,n,1);

add(l,c,1,n,1);

區間修改up

date

(l,r

,c,1

,n,1

);'>update(l,r,c,1,n,1);

update(l,r,c,1,n,1);

區間查詢ll

'>ll

ll ans

=que

ry(l

,r,1

,n,1

);'>ans=query(l,r,1,n,1);

ans=query(l,r,1,n,1);

若只涉及點更新 只需用(1)(2)(4)(6)

若只涉及區間更新 需用(1)(2)(3)(5)(6)

若兩種更新都有 則在所有向子區間查詢或更新前 都需pushdown()

hdu I hate it 區間最大值 線段樹

include define maxn 200001 define lson l,mid,rt 1 define rson mid 1,r,rt 1 1 int max maxn 2 int n,m int max int a,int b void pushup int rt 要理解好更新的定義,不...

線段樹 區間修改 最大值

最大值 區間修改 總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述 在n 1 n 100000 個數a1 an組成的序列上進行m 1 m 100000 次操作,操作有兩種 1 1 lr c 表示把a l 到a r 增加c c的絕對值不超過10000 2 ...

數列區間最大值 線段樹

acwing 1270 time limit 2s memory limit 64mb problem description 輸入一串數字,給你 m 個詢問,每次詢問就給你兩個數字 x,y要求你說出 x 到 y 這段區間內的最大數。input output 輸出共 m 行,每行輸出乙個數。samp...