單調佇列學習筆記 —— by menci
(輔助佇列 m 即為單調佇列
luogu p3957 跳房子
noip2017普及組★跳房子
顯然答案有單調性,所以二分答案。
判斷時 dp。 f[
i]表示跳前i個格仔,且停在第 i 個格仔最大分數; sc
ore[
i]表示第 i 個格仔的分數。
易得轉移方程 f[
i]=m
ax(f
[j]|
從j可以
跳到i)
+sco
re[i
] 時間複雜度:θ(
log2
nn2)
考慮優化
為了防止被卡手寫deque
這裡的nextpos
即為列舉的格仔j
_ _ _ _ _ _ _ _ _
nextpos
i
(單調佇列維護)
#include
using namespace std;
const int n = 5e5 + 5;
int n, d, k;
intpos[n], score[n];
inline bool in(int
x, int l, int r)
inline bool check(int limit)
if (ql <= qr && f[*ql] != int_min) // 為了避免下一句 int_min + 乙個負數溢位
f[i] = f[*ql] + score[i];
else f[i] = int_min;
ans = max(ans, f[i]);
}return ans >= k;
}int main()
printf("%d\n", check(pos[n]) ? l : -1);
return
0;}
單調佇列 學習筆記
q 給定乙個長度為n的序列 可能有負數 從中找出一段長度不超過m的連續子串行,使得其和最大 n 500000 n 500000 n 5000 00 a 對於這題 首先不難想到先求出數列字首和sum 那麼顯然問題的答案就是max i mn sum i minj i m i 1 sum j max n ...
單調佇列 學習筆記
單調佇列是一種特殊的雙端佇列,其滿足單調性,即內部元素單調遞增或單調遞減。單調佇列可以用陣列模擬,也可以用 stl 中的 deque 實現。例題 最大子序和 給定乙個長度為 n 的整數序列,從中找出一段長度不超過 m 的連續子串行,使得子串行中所有數的和最大。n,m leq 3 10 5 區間和可以...
單調佇列和單調棧學習筆記
單調棧 單調棧是指乙個棧內部的元素是具有嚴格單調性的一種資料結構,分為單調遞增棧和單調遞減棧。單調棧有兩個性質 1.滿足從棧頂到棧底的元素具有嚴格的單調性 2.滿足棧的後進先出特性越靠近棧底的元素越早進棧 元素進棧過程 對於乙個單調遞增棧來說 若當前進棧的元素為 a 如果a 棧頂元素則直接將a 進棧...