普通線段樹維護區間最大最小值(板子)

2022-06-26 09:06:08 字數 1739 閱讀 9514

/*

線段樹維護區間最大/小值就是按照原來給出的資料的順序建造一顆二叉樹,然後每乙個節點維護

這個節點的子節點且包含這個節點的值中的最大/小值

*/#include

#include

#include

#include

using

namespace

std;

#define ll long long

const

int max_len =1000

;int seg_tree[max_len << 2

];int lazy[max_len << 2

];int

arr[max_len];

//從下往上更新 節點

void push_up (int

root)

//從上向下更新,左右孩子

void push_down (int root, int l, int

r) }

//建樹

//[l,r]就是對應arr陣列裡面的數

void build (int root, int l, int

r)

int mid = (l + r) >> 1

; build(root

<< 1

, l, mid);

build(root

<< 1 | 1, mid + 1

, r);

push_up(root);}//

區間查詢

//查詢區間[ll,rr]的最大/小值

int query (int root, int l, int r, int ll, int

rr)

//區間修改 +-某值

//使得區間[ll,rr]的值都加上val

void update_interval(int root, int l, int r, int ll, int rr, int

val)

push_down(root, l, r);

int mid = (l + r) >> 1

;

if (ll <= mid) update_interval(root << 1

, l, mid, ll, rr, val);

if (rr > mid) update_interval(root << 1 | 1, mid + 1

, r, ll , rr, val);

push_up(root);}//

單點修改 可以改為某值,或者+-某值

//把pos位置的值改成val

void update(int root, int l, int r, int pos, int

val)

int mid = (l + r) >> 1

;

if(pos <= mid) update(root << 1

, l, mid, pos, val);

else update(root << 1 | 1, mid + 1

, r, pos, val);

push_up(root);

}int

main()

build(

1,1,n);

while(m--)

return0;

}/*5 43 2 4 5 1

1 22 4

3 52 3

*/

Function 線段樹維護區間最小值 思維

給定乙個長度為n的序列,根據上面的公式,求出f l,r 仔細觀察後發現,當l r時,答案是a l 當l r時,答案是a l a l 1 a r 假設乙個數x模乙個比它大的數,相當於沒有模,只有比x小的數才起到了取模的作用。那麼我們用線段樹維護區間最小值,每次查詢 l 1,r 範圍內第乙個比x小的數的...

poj 3264 線段樹區間最大最小值

題意 給n組資料,q個詢問,每次詢問區間l,r最大值與最小值的差是多少。解析 睡前一水,卻錯了2發。詢問的時候寫錯了,並不是直接去更新maxx minn的最大值。是直接更新maxx,minn,然後最後一減就行了。include include include include include incl...

nyoj 1185 線段樹區間最大最小值

最大最小值 時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給出n個整數,執行m次詢問。對於每次詢問,首先輸入三個整數c l r 如果c等於1,輸出第l個數到第r個數之間的最小值 如果c等於2,輸出第l個數到第r個數之間的最大值 如果c等於3,輸出第l個數到第r個數之間的最小...