noi.ac #289. 电梯(单调队列)
题意
题目链接
Sol
傻叉的我以为给出的\(t\)是单调递增的,然后\(100\rightarrow0\)
首先可以按\(t\)排序,那么转移方程为
\(f[i] = min_{j=0}^{i-1}(max(t[i], f[j]) + 2 * max_{k=j+1}^i x[k])\)
不难发现,若\(i < j\)且\(x[i] < x[j]\),那么从\(i\)转移过来一定是不优的,一定是从\(i\)之前的某个位置转移过来。(f单增)
然后直接单调队列搞一搞就行了,
#include<bits/stdc++.h>
#define Pair pair<int, int>
#define fi first
#define se second
#define LL long long
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
char buf[(1 << 22)], *p1 = buf, *p2 = buf;
using namespace std;
const int MAXN = 1e6 + 10;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N, q[MAXN], val[MAXN], top;
LL f[MAXN];
Pair a[MAXN];
signed main() {N = read(); for(int i = 1; i <= N; i++) a[i].fi = read(), a[i].se = read();sort(a + 1, a + N + 1);for(int i = 1; i <= N; i++) {while(top && a[i].se > a[top].se) top--;a[++top] = a[i];}memset(f, 0x7f, sizeof(f));N = top; f[0] = 0;int l = 1, r = 0, las = 0;for(int i = 1; i <= N; i++) {while(l <= r && a[i].fi >= f[q[l]]) las = q[l++];if(las < i) chmin(f[i], a[i].fi + 2ll * a[las + 1].se);if(l <= r) chmin(f[i], val[l]);int cur = f[i] + 2ll * a[i + 1].se;while(l <= r && cur <= val[r]) r--;q[++r] = i; val[r] = cur;}cout << f[N];return 0;
}
转载于:https://www.cnblogs.com/zwfymqz/p/10590303.html
noi.ac #289. 电梯(单调队列)相关推荐
- Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值
文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...
- 单调队列板子:求滑动窗口中最大值和最小值
文章目录 题目分析 初始思路 单调队列优化的思路 代码1:数组模拟单调队列的代码 代码2:deque容器实现 能用到单调队列的情景比较有限: 1.典型的有滑动窗口的最值, 2.找到里它最近的比它大(小 ...
- hdu 4362(单调队列优化dp)
题意:有m个阶段,每个阶段都有n个龙珠,当在某一阶段选择一个龙珠,该阶段其他龙珠都会消失.给出两个m*n的矩阵,第一个矩阵表示消灭第i个阶段第j个龙珠的位置,第二个矩阵表示取第i个阶段第j个龙珠消耗的 ...
- 算法竞赛入门与进阶 (二)单调队列、单调栈
栈(stack)和队列( queue ) 1.栈的定义:栈是限定仅在表头进行插入和删除操作的线性表(先进后出) 2.队列的定义:队列是一种特殊的线性表,特殊之处在于 它只允许在表的前端(front)进 ...
- [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料
首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...
- 单调队列优化多重背包
就是按照 % 体积的余数来分组,每组单调队列优化. 直接上模板好了. 1 #include <bits/stdc++.h> 2 3 typedef long long LL; 4 cons ...
- 【学习笔记】多重背包相关优化——二进制优化/单调队列优化
多重背包--二进制优化/单调队列优化 二进制优化 单调队列优化 代码都是 POJ1742 的,注意,那道题二进制优化会超时. 普通的多重背包式子,物品个数限制:c[i]c[i]c[i],单个物品价值 ...
- 牛客练习赛79E-小G的数学难题【dp,单调队列】
正题 题目链接:https://ac.nowcoder.com/acm/contest/11169/E 题目大意 给出nnn个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai,bi,ci ...
- [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)
4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MB Submit: 374 Solved: 130 [Submit][Status][Di ...
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1567 Solved: 718 [Submit][Statu ...
最新文章
- 如何在空硬盘Linux系统,Linux系统如何新增一块硬盘
- 设置树莓派的无线网卡为监听模式(monitor)
- RxSwift 案例学习(一)
- Linux之systemctl命令的使用
- python怎么添加csv模式_python对csv文件追加写入列的方法
- button常用属性_web阶段常用单词明细表,你值得拥有
- 《帝王三部曲》——二月河
- 【opencv学习】SIFT算法的基本使用以及特征匹配
- USACO Dual Palindrome
- 《勒索软件经济分析》:“理想赎金”950英镑
- 全国自然保护区生态功能区分布数据
- K3路由器自建服务器,折腾路由器 篇一:K3路由器刷官改固件小白日记
- android蓝牙软件,Android手机蓝牙助手(Bluetooth File Transfer)
- 微信小程序图片上传java后台
- ubuntu 旺旺_Ubuntu 下通过Wine安装阿里旺旺并解决中文乱码
- 移动硬盘驱动怎么修复_为什么您的新硬盘驱动器未在Windows中显示(以及如何修复)...
- 锐龙r5 5600h核显什么水平 r5 5600h属于什么级别
- 视频教程-Ps教程之神奇的Photoshop自动化技术-Photoshop
- Linux配置SVN 服务端
- 关于高通QPST平台功能和选项的一些简单说明