/*線段樹維護區間最大/小值就是按照原來給出的資料的順序建造一顆二叉樹,然後每乙個節點維護
這個節點的子節點且包含這個節點的值中的最大/小值
*/#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個數之間的最小...