单调队列学习笔记
来源:互联网 发布:上海网络推广 编辑:程序博客网 时间:2024/06/07 13:45
单调队列学习笔记 —— By Menci
(辅助队列 M 即为单调队列
Luogu P3957 跳房子
NOIP2017普及组★跳房子
显然答案有单调性,所以二分答案。
判断时 DP。
易得转移方程
时间复杂度:
考虑优化
为了防止被卡手写 deque
这里的 nextPos
即为枚举的格子 j
_ _ _ _ _ _ _ _ _
nextPos
i
(单调队列维护)
#include <bits/stdc++.h>using namespace std;const int N = 5e5 + 5;int n, d, k;int pos[N], score[N];inline bool in(int x, int l, int r) { return x >= l && x <= r;}inline bool check(int limit) { int xl = max(1, d - limit), xr = d + limit; static int q[N]; // q 是维护的单调队列 int *ql = q, *qr = q - 1; // ql 是 q 当前的最大值,qr 是 q 的最小值 static int f[N]; int nextPos = 0; // nextPos 是尝试在 qr 右边新加入的数的位置 int ans = 0; for(int i = 1; i <= n; i ++) { // 左边不满足的删掉 while (ql <= qr && !in(pos[i] - pos[*ql], xl, xr)) ql ++; // 尝试右边能不能加 for (; nextPos <= n && pos[i] - pos[nextPos] > xr; nextPos ++); for (; nextPos <= n && pos[i] - pos[nextPos] >= xl; nextPos ++) { // 将 nextPos 加入到单调队列 // 维护单调性 while(ql <= qr && f[*qr] <= f[nextPos]) qr --; // nextPos 与队尾元素 qr 比较 *++ qr = nextPos; // nextPos 成为新的队尾 } 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() { scanf("%d%d%d", &n, &d, &k); for (int i = 1; i <= n; i ++) scanf("%d%d", &pos[i], &score[i]); int l = 0, r = pos[n]; while (l < r) { int mid = l + (r - l) / 2; if (check(mid)) r = mid; else l = mid + 1; } printf("%d\n", check(pos[n]) ? l : -1); return 0;}
阅读全文
0 0
- 学习笔记:单调队列
- 单调队列 学习笔记
- 单调队列学习笔记
- Algorithm学习笔记 --- 单调队列
- 学习笔记:复习单调队列
- [HAOI2007]理想正方形-单调队列学习笔记
- |算法讨论|单调队列 学习笔记
- 单调队列学习 PKU2823
- 单调队列学习
- 单调队列学习
- 单调队列学习小结
- 单调队列学习
- 单调队列的学习
- Algorithm学习笔记 --- Set Definition(单调队列)
- [HNOI2008]玩具装箱-DP斜率优化-单调队列-学习笔记
- 单调队列的学习 pku2823
- 单调栈 学习笔记
- 单调队列或单调栈的学习及认识
- phpcms v9 目录式伪静态
- Android 如何使用小的Ratingbar
- Linux基础
- 使用Python3计算HTTP的摘要Response值
- 随机函数的应用
- 单调队列学习笔记
- HDU 3763 C D(二分)
- Java学习——面向对象基础
- java设计模式-单例模式
- python pygame练习
- PAT乙级1063
- 11. Container With Most Water
- 编程求和:s=a+aa+aaa+aaaa+ ??+aaaa?aaa(n个),其中a为1~9中的一个数字。 提示:若第一项为a , 以后每一项由前一项乘以10加上a递推得到,然后求和。 #incl
- 21.post与get的区别