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 ...
最新文章
- Java实现图的深度和广度优先遍历算法
- 学完可以解决90%以上的数据分析问题-利用python进行数据分析第二版(代码和中文笔记)...
- linux考试基础知识测验
- homebrew安装mysql
- Flume在企业大数据仓库架构中位置及功能
- mac下配置openfire
- mysql A库a表 B库b表 将a表导入b表中
- JQuery获取第几个元素和判断元素在第几个
- java1.6升级1.7_jdk从1.6升级到1.7可能会遇到的Version问题
- Java单例模式实现(线程安全)
- atitit.流程标准化--- mysql启动不起来的排查流程attilax总结
- MYSQL SHOW VARIABLES简介
- 在IE浏览器里打开谷歌
- Sqoop常用命令回顾
- 如何用python自动改试卷_2019Python100道面试题,你会几道?
- 激光打印机工作原理1
- 刚从阿里、头条面试回来,熬夜整理华为最新Java笔试题,进阶学习
- 分支限界算法 之 A*算法(启发式搜索算法)---九宫重排游戏(也称八数码问题)
- 第一篇——从这里开始
- Snipaste工具推荐