題庫字尾為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 次修改,每次你會...