Codeforces 311B Cats Transport【斜率优化DP】
题目大意
有一些猫,放在一些位置,人一步移动一个位置
给出每个猫出现的时间,每个人可以自由安排其出发时间,沿途已经出现的猫捡起,猫等待的时间是被减去的时间减去出现的时间
猫可以等人,人不能等猫
现在有P个人,问猫等待的总时间T最小是多少。
思路
首先可以算出要捡起每个猫最早出发的时间是多少\(c_i\)
然后按照这个值排序,每个人捡起的猫一定是在这个值上连续的一段
然后计算出如果一个人选\([l,r]\),等待时间到达每个猫的时间减去到个猫最小的时间,是\(c_r*(r-l+1)-(s_r-s_{l-1})\)
其中s是c的前缀和,为什么呢?因为c是刚好捡起没个猫的时间,所以\(c_r-c_i\)就是刚好捡起r时候i的等待时间
然后就变成了\(dp_{i,j}=dp_{k,j-1}+c_i*(i-k)-(s_i-s_k)\)
转化一下发现\(x'=k,k'=c_i,y'=dp_{k,j-1}+s_k,b'=dp_{i,j}+s_i-i*c_i\)
斜率单调递增,最小化截距,直接维护下凸壳就可以了
//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
typedef pair<int, int> pi;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
//c_i = t_i - d_i
//s_i = \sum_{j=1}^i c_j
//dp[i][j] = min(dp[k][j - 1] + c_i * (i - k) - (s_i - s_k)
const int N = 1e5 + 10;
const int K = 1e2 + 10;
ll n, m, p;
ll d[N], s[N], c[N];
ll dp[N][K];
struct Node {ll x, y;} q[N];
ll operator * (const Node a, const Node b) {
return a.x * b.y - a.y * b.x;
}
Node operator - (const Node a, const Node b) {
return (Node){a.x - b.x, a.y - b.y};
}
ll calc(Node a, ll pos) {
return a.y - s[pos] + c[pos] * (pos - a.x);
}
int main() {
freopen("input.txt", "r", stdin);
Read(n), Read(m), Read(p);
fu(i, 2, n) Read(d[i]), d[i] += d[i - 1];
fu(i, 1, m) {
int t, h; Read(h), Read(t);
c[i] = t - d[h];
}
sort(c + 1, c + m + 1);
fu(i, 1, m) {
s[i] = s[i - 1] + c[i];
dp[i][1] = - s[i] + i * c[i];
}
int l, r;
fu(j, 2, p) {
q[l = r = 1] = (Node) {0ll, 0ll};
fu(i, 1, m) {
while (l < r && calc(q[l], i) >= calc(q[l + 1], i)) ++l;
dp[i][j] = calc(q[l], i);
Node now = (Node){i, dp[i][j - 1] + s[i]};
while (l < r && (q[r] - now) * (q[r - 1] - now) > 0) --r;
q[++r] = now;
}
}
Write(dp[m][p]);
return 0;
}
Codeforces 311B Cats Transport【斜率优化DP】的更多相关文章
- Codeforces 311B Cats Transport 斜率优化dp
Cats Transport 出发时间居然能是负的,我服了... 卡了我十几次, 我一直以为斜率优化写搓了. 我们能得出dp方程式 dp[ i ][ j ] = min(dp[ k ][ j - 1 ...
- CodeForces 311 B Cats Transport 斜率优化DP
题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...
- CF311B Cats Transport 斜率优化DP
题面:CF311B Cats Transport 题解: 首先我们观察到山与距离其实是没有什么用的,因为对于任意一只猫,我们都可以直接算出如果有一个人要恰好接走它,需要在哪一时刻出发,我们设第i只猫对 ...
- CF331B Cats Transport[斜率优化dp+贪心]
luogu翻译 一些山距离起点有距离且不同,m只猫要到不同的山上去玩ti时间,有p个铲屎官人要去把所有猫接走,步行速度为1单位每秒,从1走到N座山不停下,必须在猫玩完后才可以把他带走.可以提前出发.问 ...
- 【题解】Cats Transport (斜率优化+单调队列)
[题解]Cats Transport (斜率优化+单调队列) # When Who Problem Lang Verdict Time Memory 55331572 Jun/09/2019 19:1 ...
- $CF311B\ Cats\ Transport$ 斜率优化
AcWing Description Sol 设f[i][j]表示前i个饲养员接走前j只猫咪的最小等待时间. 要接到j猫咪,饲养员的最早出发时间是可求的,设为d: $ d[j]=Tj-\sum_{k= ...
- CodeForces - 311B:Cats Transport (DP+斜率优化)
Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...
- 斜率优化 dp 总结
我们以一道例题引入: 洛谷 P2365 任务安排: \(n\) 个任务排成一个序列在一台机器上等待完成(顺序不得改变),这 \(n\) 个任务被分成若干批,每批包含相邻的若干任务. 从零时刻开始,这些 ...
- 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...
随机推荐
- Python基础笔记系列十四:python无缝调用c程序
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python语言可以对c程序代码进行调用,以弥补python语言低性能的缺 ...
- Python基础笔记系列十三:socket网络编程
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!!使用python编写一个简易的服务端程序和客户端程序,启动服务端和客户端(监 ...
- ubuntu如何U盘启 动制作
先到出 U盘的位置, 方法有很多,terminal 用root权限,采用fdisk -f 命令 unmount /dev/sdb -I //U盘拨出 sdb为U盘挂载的位置 mkfs.fat /dev ...
- Microsoft's OWIN implementation, the Katana project
参考: https://github.com/aspnet/AspNetKatana/ https://github.com/aspnet/AspNetKatana/wiki/Roadmap
- 五、Google Code Prettify:实现代码高亮的JS库
介绍 code prettify 解释为 “代码修饰”. 他由JS代码和CSS代码构成,用来高亮显示HTML页面中的代码. 支持:C, Java, Python, Bash, HTML, XML, J ...
- linux 使用dd命令清空文件
- Highcharts 配置语法;Highcharts 配置选项详细说明
Highcharts 配置语法 本章节我们将为大家介绍使用 Highcharts 生成图表的一些配置. 第一步:创建 HTML 页面 创建一个 HTML 页面,引入 jQuery 和 Highchar ...
- 5G信令(就是用户身份信息)风暴——就是客户端通过公钥加密的消息(携带手机IMSI号)发给服务端,服务器需用私钥解密,这个解密比较消耗资源,如果短时间大量请求到来就会触发信令风暴
信令:手机开机后,先从USIM中读取之前运营商分配的临时身份信息GUTI/TMSI,发送携带该身份信息的信令给基站,请求接入运营商网络. 如果每个设备的每条消息都需要单独认证,则网络侧安全信令的验证需 ...
- LeetCode OJ:Implement Queue using Stacks(栈实现队列)
比较典型的一个题目,easy,不过可以有许多实现方式. 这里用的方式是每次pop完成之后再将stack2中的内容立即倒回stack1中.但是其他的实现也可以不是这样,可以是需要push的时候检查再,如 ...
- LeetCode OJ:Number of 1 Bits(比特1的位数)
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...