Grand Prix of Saratov - D. Elevator - DP
题意: 有一台电梯,可以容纳无限容量的人,初始在 0 层,每次可以移动到所载人群中 需要到达的最高层,并最终返回 0 层。每层移动时间为 1,忽略人进出时间。现在有 nnn 名按时间顺序到达 0 层电梯口的人,第 iii 个人将在 tit_iti 时刻到达电梯口,想去楼层 aia_iai。现在询问最短花费多少时间使得电梯将所有人运送玩并回到 0 层?
- 1≤n≤2×1051\le n\le 2\times 10^51≤n≤2×105
- 1≤ti,ai≤1091\le t_i,a_i\le 10^91≤ti,ai≤109
题解: 考虑第 iii 个人要上到第 aia_iai 层,那么排在第 iii 个人前面的人 jjj,如果他要上的楼层 aj<aia_j<a_iaj<ai,显然可以让第 jjj 个人和第 iii 个人乘坐同一趟电梯,而时间不会更长。因此把这些人合并以后的 aaa 数组是单调递减的。接着考虑动态规划,f(i)f(i)f(i) 表示第 iii 个人时候电梯启动,把前 iii 个人送完所花费的最小时间,那么有 f(i)=min(max(f(j)+2×aj+1,ti+2×aj+1))f(i)=\min(\max(f(j)+2\times a_{j+1},t_i+2\times a_{j+1}))f(i)=min(max(f(j)+2×aj+1,ti+2×aj+1)),其中的 max\maxmax 部分是讨论送完 jjj 以后第 j+1j+1j+1 到 iii 的人有没有来。
但是这样是 O(n2)\mathcal{O}(n^2)O(n2) 的,不能接受,考虑怎么优化。注意到 f(i)f(i)f(i) 是非递减的,而 aia_iai 是递减的,显然对于第二部分 ti+2×aj+1t_i+2\times a_{j+1}ti+2×aj+1,我们可以维护一个 jjj 使得 k∈[1,j−1]k\in[1,j-1]k∈[1,j−1] 均有 f(k)≤tif(k)\le t_if(k)≤ti,初始让 f(i)=ti+aj+1f(i)=t_i+a_{j+1}f(i)=ti+aj+1,接着只需要讨论 min(f(j)+2×aj+1)\min(f(j)+2\times a_{j+1})min(f(j)+2×aj+1),这东西可以用优先队列维护,但是注意必须满足 f(j)>tif(j)>t_if(j)>ti 成立,因为 ttt 也是单调递增,如果存在 f(j)<tif(j)<t_if(j)<ti,显然对于后面任何的 k>ik>ik>i 均有 f(k)<tkf(k)<t_kf(k)<tk,因此直接pop
它就行。
代码: 时间复杂度是 O(nlogn)\mathcal{O}(n\log n)O(nlogn)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
struct node {int t, a;
} p[maxn];
ll f[maxn];
int main() {int n;while (~scanf("%d", &n)) {for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].t, &p[i].a);vector<node> v;for (int i = n; i >= 1; i--) {if (v.empty() || p[i].a > v.back().a) v.push_back(p[i]);}int m = v.size();reverse(v.begin(), v.end());priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll>>> q;int id = 0;for (int i = 0; i < m; i++) {while (id < i && f[id] <= v[i].t) id++;f[i] = 2LL * v[id].a + v[i].t;while (!q.empty()) {pair<ll, ll> now = q.top();if (now.second <= v[i].t) q.pop();else {f[i] = min(f[i], now.first);break;}}if (i < m - 1) q.push({f[i] + 2LL * v[i + 1].a, f[i]});}printf("%lld\n", f[m - 1]);}return 0;
}
Grand Prix of Saratov - D. Elevator - DP相关推荐
- XXI Open Cup. Grand Prix of Korea I. Query On A Tree 17 树剖 + 二分 + 树带权重心
传送门 文章目录 题意: 思路: 题意: 给你一棵树,每棵树初始权值都为000,现在给你两个操作: (1)(1)(1)将uuu的子树权值全部加111. (2)(2)(2)将(u,v)(u,v)(u,v ...
- 2015-2016 XVI Open Cup, Grand Prix of Bashkortostan, SKB Kontur Cup Stage 2
地址 Rank Solved A B C D E F G H I J K L M 72/213 8/13 O . O O . O . O O O . O Ø O: 当场通过 Ø: 赛后通过 .: 尚未 ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of SPb
A. Base $i - 1$ Notation 两个性质: $2=1100$ $122=0$ 利用这两条性质实现高精度加法即可. 时间复杂度$O(n)$. #include<stdio.h&g ...
- 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus)
题目链接 C. Brave Seekers of Unicorns 给出一个好数组的定义: 1.1.1. 长度不为空 2.2.2. a[i]⨁a[i−1]⨁a[i−2]≠0a[i] \bigoplus ...
- 2020-2021 ACM-ICPC, Asia Nanjing Regional Contest (XXI Open Cup, Grand Prix of Nanjing)
M. Monster Hunter 树形背包dp dp[i][j][k] 表示结点i的子树中有j个节点存活且当前节点i的状态为(0/1) 转移方程: dp[x][i+j][0]=min(dp[x][i ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea
A. Donut 扫描线+线段树. #include<cstdio> #include<algorithm> using namespace std; typedef long ...
- [XXII Open Cup, Grand Prix of Korea M]Yet Another Range Query Problem
Yet Another Range Query Problem 题解 首先,看到这道题,我们应该是比较容易联想到扫描线加线段树的. 我们考虑维护每个点作为左端点到当前扫到的这个点作为右端点之间区间的信 ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
1. GUI 按题意判断即可. #include<stdio.h> #include<iostream> #include<string.h> #include&l ...
- G-Lexicographically Minimum Walk[CF-Gym-102391][2019-2020 XX Open Cup, Grand Prix of Korea]
原题传送门 题面 Lexicographically Minimum Walk time limit per test2 secondsmemory limit per test1024 megaby ...
- [XXI Open Cup.Grand Prix of Korea]Advertisement Matching
Advertisement Matching 题解 首先,题目的 a , b a,b a,b匹配显然是一个很常见的贪心. 有结论,设 a a a的集合为 A A A,如果 ∀ S ⊆ A , ∑ a ...
最新文章
- 20210927 LQR
- QT的QReadLocker类的使用
- 警惕python中的*重复符(运算符)
- Asp.net中使用WEB编辑控件FCKEditor
- git 常用命令思维导图
- 南京软件测试自学英语,南京软件测试门槛高吗?南京软件测试学哪些
- 如何在EXCEL中锁定表格的某一行
- rf扫描枪_RF枪_RF手持扫描枪_RF手持机
- SSM框架超市进销存出库入库仓库管理系统(idea开发javaweb-javaee-j2ee-springboot) 退货管理 销售管理 供应商管理 客户管理 员工管理 以及库存统计和盘存统计
- 什么是迭代器(Iterator)?
- html中鱼眼效果,鱼眼镜头使用入门指南:鱼眼镜头应该怎么用(附后期鱼眼效果)...
- ZZULIOJ1081-1090
- 大牛证券这周操作及方向看这里
- 日期+月份的计算,得出另一个日期
- poj2228Naptime——环形DP
- 6.S081 Xv6 Lab 5: lazy page allocation
- C#命名规范中文版/C#编码规范中文版
- 智能扫描文件免费版隐私政策
- 如何利用人工智能技术来快速开发一款游戏呢?
- 基于matlab人,基于MATLAB的人口预测研究