Codeforces 311B Cats Transport 斜率优化dp
出发时间居然能是负的,我服了。。。 卡了我十几次, 我一直以为斜率优化写搓了。
我们能得出dp方程式 dp[ i ][ j ] = min(dp[ k ][ j - 1 ] + hs[ i ] * (cnt[ i ] - cnt[ j ]) - sum[ i ] + sum[ j ]) k < i
这个东西显然能斜率优化, 直接搞。
其实不用离散化直接dp更好写。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long
using namespace std; const int N = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-; int n, m, p, d[N], hs[N], h[N], t[N], tot;
LL dp[][N], cnt[N], sum[N];
int que[][N], head[], rear[]; int getId(int x) {
return lower_bound(hs + , hs + tot + , x) - hs;
} double calc(int j, int k, int t) {
return 1.0 * (dp[t][j] + sum[j] - dp[t][k] - sum[k]) / (cnt[j] - cnt[k]);
} int main() {
scanf("%d%d%d", &n, &m, &p);
for(int i = ; i <= n; i++) scanf("%d", &d[i]);
for(int i = ; i <= n; i++) d[i] += d[i - ];
LL mn = INF;
for(int i = ; i <= m; i++) {
scanf("%d%d", &h[i], &t[i]);
t[i] -= d[h[i]];
mn = min(mn, 1ll*t[i]);
}
for(int i = ; i <= m; i++) {
t[i] -= mn;
hs[++tot] = t[i];
}
sort(hs + , hs + tot + );
tot = unique(hs + , hs + tot + ) - hs - ;
for(int i = ; i <= m; i++) cnt[getId(t[i])]++;
for(int i = ; i <= tot; i++) sum[i] = sum[i - ] + cnt[i] * hs[i];
for(int i = ; i <= tot; i++) cnt[i] += cnt[i - ];
int cur = , lst = ;
for(int j = ; j <= p; j++) {
swap(cur, lst);
memset(dp[cur], INF, sizeof(dp[cur]));
head[cur] = ;
rear[cur] = ;
for(int i = j; i <= tot; i++) {
if(j == ) {
dp[cur][i] = hs[i] * cnt[i] - sum[i];
}
else {
while(rear[lst]-head[lst]+ >=
&& calc(que[lst][head[lst]+], que[lst][head[lst]], lst) < hs[i]) head[lst]++;
int who = que[lst][head[lst]];
dp[cur][i] = dp[lst][who] + hs[i] * (cnt[i] - cnt[who]) - sum[i] + sum[who];
}
while(rear[cur]-head[cur]+ >= &&
calc(que[cur][rear[cur]], que[cur][rear[cur]-], cur) >
calc(i, que[cur][rear[cur]], cur)) rear[cur]--;
que[cur][++rear[cur]] = i;
}
}
LL ret = INF;
if(p >= tot) ret = ;
else ret = dp[cur][tot];
printf("%lld\n", ret);
return ;
} /*
*/
Codeforces 311B Cats Transport 斜率优化dp的更多相关文章
- 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 ...
- Codeforces 311B Cats Transport【斜率优化DP】
LINK 题目大意 有一些猫,放在一些位置,人一步移动一个位置 给出每个猫出现的时间,每个人可以自由安排其出发时间,沿途已经出现的猫捡起,猫等待的时间是被减去的时间减去出现的时间 猫可以等人,人不能等 ...
- 斜率优化 dp 总结
我们以一道例题引入: 洛谷 P2365 任务安排: \(n\) 个任务排成一个序列在一台机器上等待完成(顺序不得改变),这 \(n\) 个任务被分成若干批,每批包含相邻的若干任务. 从零时刻开始,这些 ...
- 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...
随机推荐
- NOIP2018 No regrets youth
NOIP2018在即,20181009总结一些易错的知识点和解题方法 ——by ljc20020730 HGOI NOIP2018 No regrets youth ! NOIP2018 No reg ...
- Python 使用multiprocessingm模块创建多进程
from multiprocessing import Process def run_proc(name): print("子进程Process %s(%s)运行..."%(na ...
- 【洛谷P1341】无序字母对
题目大意:给定 n 个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有 n+1 个字母的字符串使得每个字母对都在这个字符串中出现. 题解:每个无需字母对可以看成无 ...
- 在Linux中将脚本做成系统服务
有一些情况下,我们需要将某些脚本作为系统服务来运行.比如,在我使用workerman框架开发php程序时,需要使用管理员权限来运行,而且需要开机自行启动程序提供服务.这个时候将启动程序写成服务就可以很 ...
- 域名、ip、以及通过域名访问网站、虚拟主机
ip 是一个网站的id,是它的地址. 域名是为了解决ip比较难记住才引出的. 利用nginx来配置虚拟主机,通过域名可以访问该网站. 具体实现详见前面文章. 虚拟主机:可以实现在一台服务器虚拟出多个网 ...
- linux查看硬盘详细信息
最近公司新进了一批设备,为了弄清楚厂家有没有忽悠我们,分配给我一个任务 查看磁盘是不是二手的,window上有鲁大师啥的那么linux有什么软件吗? 答案是有的! 叫做smart 具体请查看: htt ...
- SQL记录-PLSQL-DBMS输出
PL/SQL DBMS输出 DBMS_OUTPUT是一个内置的软件包,能够显示输出显示调试信息,并从PL/ SQL块,子程序,包和触发器发送消息.我们已经使用这个包在我们所有的教程中. 让我们来看 ...
- 何凯文每日一句打卡||DAY12
- Bower使用笔记
全局安装bower $ npm install -g bower 检测成功 $ bower help 在项目根目录下进行安装(最新版本),会自动生成一个bower_components文件夹(如果在c ...
- CSS 实现图片灰度效果
非原创-从网上收索出来的文章 CSS实现图片灰度效果就是通过CSS样式让彩色图片呈现为灰色,相当于把一张图像的颜色模式调整为灰度,CSS可以通过以下几种方法来实现灰度效果. 方式1. IE滤镜 img ...