陶陶摘蘋果 線段樹維護單調棧

2022-03-19 18:55:25 字數 869 閱讀 6423

題庫字尾為contest/132/problem/2

目前本人比較偏向的板子中,核心是乙個calc函式,傳入兩個引數——\(rt\) 和 \(w\) ,\(w\) 代表 \(rt\) 節點所統領的區間所受到的限制的值。

如果左兒子的最大值比 \(w\) 大,那麼就遞迴左兒子,右兒子不必再遞迴,因為單調遞增,右兒子的最小值一定大於等於左兒子的最大值。①

否則遞迴右兒子,這時候左兒子一定不滿足,而右兒子有可能滿足。②

還有就是到葉子節點的時候,直接和 \(w\) 比較一下就好了。③

然後pushup的時候記得對右兒子呼叫calc函式(上面說的右兒子會受左兒子限制),以保證單調性

#include#include#include#include#define r register

#define n 100010

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m,h[n];

struct nodetr[n<<2];

#define ls rt<<1

#define rs rt<<1|1

int calc(int rt,int w)

void pushup(int rt)

void build(int rt,int l,int r)

void modify(int rt,int x)

int main()

return 0;

}

單調棧 線段樹

sequence 時間限制 c c 3秒,其他語言6秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld your are given two sequences a1 na a1 n and b1 nb b1 n you need to answe...

線段樹維護單調子串行

顯然這樣的操作,區間無法直接合併 我們考慮o l ogn o logn o logn 的push uppushup pushup 首先左兒子的最長長度不會變,我們考慮遞迴右兒子下去,並令當前的max nmaxn maxn 為左兒子的max nmaxn maxn 1,如果當前pus huppushup...

高手訓練 線段樹 棧的維護

time limit 20 sec memory limit 512 mb 從前有個棧,一開始是空的。你寫下了 m 個操作,每個操作形如 k v 若 k 0,代表往棧頂加入乙個數 v 若 k 1,則代表從棧頂彈出 v 個數,如果棧中的元素少於 v 個,則全部彈出。接著你又進行了 q 次修改,每次你會...