L1 - 单调队列
Lesson #1
单调队列一般是求 Q Q Q 组询问的极值的。
假设第 i i i 个询问的区间左端点为 l i l_i li,右端点为 r i r_i ri,满足 l 1 ≤ l 2 ≤ l 3 ≤ ⋯ ≤ l n l_1\le l_2\le l_3\le \cdots\le l_n l1≤l2≤l3≤⋯≤ln, r 1 ≤ r 2 ≤ r 3 ≤ ⋯ ≤ r n r_1\le r_2\le r_3\le \cdots\le r_n r1≤r2≤r3≤⋯≤rn,那么可以在 KaTeX parse error: Undefined control sequence: \cal at position 1: \̲c̲a̲l̲ ̲O(N) 的时间内求出答案。
因为常数较小, N N N 一般可以做到 1 0 7 10^7 107 级别。
使用 STL
的单调队列只能做到
3
⋅
1
0
6
3\cdot 10^6
3⋅106 级别。
单调队列求最大值:维护一个单调队列,每一次将 l i − 1 ∼ l i − 1 l_{i-1}\sim l_i-1 li−1∼li−1 之间的数删除,然后插入 r i − 1 + 1 ∼ r i r_{i-1}+1\sim r_i ri−1+1∼ri 之间的数,如果 r j ( j ∈ [ r i − 1 + 1 , r i ] ) r_j(j\in [r_{i-1}+1,r_i]) rj(j∈[ri−1+1,ri]) 满足 r j ≥ r j − 1 r_j\ge r_{j-1} rj≥rj−1 那么弹出 r j − 1 r_{j-1} rj−1 即可。
求区间最值的其他方法:树状数组/线段树 O ( N log N ) \mathcal O(N\log N) O(NlogN),RMQ O ( N log N ) ∼ O ( N ) \mathcal O(N\log N)\sim \mathcal O(N) O(NlogN)∼O(N)。
Lesson #2
单调队列优化DP。