前置芝士:斜率优化  
剥下这道题的外壳,让它变为一道裸的斜率优化。
很容易想到状态,但复杂度显然过不去,也没有单调性,只能自己创造。

$$c[i] = t - sum[i],sum[i] = \sum_{j = 1} ^{i} d[j]$$
如果出发时间为t,那么 t - c[i] 即是等待时间
将 c 数组排序后,带走其中一个即可以带走旁边几个,那就是变成了连续选择,c排序后有了单调性,那么转移式就成了
dp[k][i]表示第 k 个饲养员,到 i 这个地方取猫的最小代价
$$dp[k][i] = min(dp[k - 1][j] + \sum_{t = j + 1}^ic[i] - c[t])(j \le i )$$
发现之中有前缀和

$$S_i = \sum_{t = 1}^ic[t]$$
那么化简式子后就成了一个标准的斜率优化
$$dp[k - 1][j] + S_j = c[i] * j + dp[k][i] - c[i] * i$$

具体实现不懂的

#include<bits/stdc++.h>

using namespace std;
#define N 100001
long long f[101][N];
struct node {
int k,las;
}p[N * 101];
int l = 1,r = 0;
int n,m,q;
long long sumd[N];
struct cats {
long long a,sum;
}c[N];
bool cmp(cats x,cats y) {
return x.a < y.a;
}
inline bool checkhead(int x1,int x2,int pos,int peo) {
if(l + 1 > r) return false;
peo--;
if(f[peo][x2] - f[peo][x1] + c[x2].sum - c[x1].sum <= (x2 - x1) * c[pos].a) return true;
return false;
}
inline bool check(int x1,int x2,int pos,int peo) {
if(r - 1 < l) return false;
peo--;
if((f[peo][x2] - f[peo][x1] + c[x2].sum - c[x1].sum) * (pos - x2) <= (f[peo][pos] - f[peo][x2] + c[pos].sum - c[x2].sum) * (x2 - x1)) {
return true;
}
return false;
}
int main() {
scanf("%d %d %d", &n, &m, &q);
for(int i = 2;i <= n;i++) {
scanf("%d", &sumd[i]);
sumd[i] += sumd[i - 1];
}
for(int i = 1;i <= m;i++) {
int pos,t;
scanf("%d %d", &pos, &t);
c[i].a = t - sumd[pos];
}
int cnt = 0;
sort(c + 1,c + m + 1,cmp);
for(int i = 1;i <= m;i++) {
c[i].sum = c[i - 1].sum + c[i].a;
}
for(int i = 1;i <= m;i++) {
f[1][i] = i * c[i].a - c[i].sum;
}
f[0][0] = 0;
for(int i = 2;i <= q;i++) {
l = 1,r = 0;
p[++r].k = 0;
c[0].a = 0,c[0].sum = 0;
for(int j = 1;j <= m;j++) {
while(l <= r && checkhead(p[l].k,p[l + 1].k,j,i)) {
l++;
}
int k = p[l].k;
f[i][j] = f[i - 1][k] + c[k].sum + c[j].a * j - c[j].a * k - c[j].sum;
while(l <= r && check(p[r].k,p[r - 1].k,j,i)) {
r--;
}
p[++r].k = j;
}
}
cout<<f[q][m];
return 0;
}

题解 CF311B Cats Transport的更多相关文章

  1. CF311B Cats Transport 斜率优化DP

    题面:CF311B Cats Transport 题解: 首先我们观察到山与距离其实是没有什么用的,因为对于任意一只猫,我们都可以直接算出如果有一个人要恰好接走它,需要在哪一时刻出发,我们设第i只猫对 ...

  2. 【题解】Cats Transport (斜率优化+单调队列)

    [题解]Cats Transport (斜率优化+单调队列) # When Who Problem Lang Verdict Time Memory 55331572 Jun/09/2019 19:1 ...

  3. CF311B Cats Transport

    题意 Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straigh ...

  4. CF311B Cats Transport(斜率优化)

    题目描述 Zxr960115 是一个大农场主.他养了m只可爱的猫子,雇佣了p个铲屎官.这里有一条又直又长的道路穿过了农场,有n个山丘坐落在道路周围,编号自左往右从1到n.山丘i与山丘i-1的距离是Di ...

  5. $CF311B\ Cats\ Transport$ 斜率优化

    AcWing Description Sol 设f[i][j]表示前i个饲养员接走前j只猫咪的最小等待时间. 要接到j猫咪,饲养员的最早出发时间是可求的,设为d: $ d[j]=Tj-\sum_{k= ...

  6. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  7. 题解-Cats Transport

    题解-Cats Transport Cats Transport 有 \(n\) 个山丘,\(m\) 只猫子,\(p\) 只铲屎官.第 \(i-1\) 个山丘到第 \(i\) 个山丘的距离是 \(d_ ...

  8. 笔记-Cats Transport<已写题解>

    笔记-Cats Transport Cats Transport 令 \(D_i=\sum_{j=1}^id_i\),\(T_i=t_i-D_{h_i}\). 为 \(T_i\) 从小到大排序,令 \ ...

  9. 一本通1609【例 4】Cats Transport

    1609:[例 4]Cats Transport 时间限制: 1000 ms         内存限制: 524288 KB sol:非常偷懒的截图了事 注意:只能猫等人,不能人等猫 对于每只猫,我们 ...

随机推荐

  1. openresty 学习笔记二:获取请求数据

    openresty 学习笔记二:获取请求数据 openresty 获取POST或者GET的请求参数.这个是要用openresty 做接口必须要做的事情.这里分几种类型:GET,POST(urlenco ...

  2. postgresql无序uuid性能测试

    无序uuid对数据库的影响 由于最近在做超大表的性能测试,在该过程中发现了无序uuid做主键对表插入性能有一定影响.结合实际情况发现当表的数据量越大,对表插入性能的影响也就越大. 测试环境 Postg ...

  3. spring如何集成第三方框架? 比如mybatis

    实体Bean的创建: 1: 基于class构建, 2: 构造方法构建 3: 静态工厂方法创建 4: FactoryBean构建 spring如何集成第三方框架? 比如mybatis 在mybatis中 ...

  4. ES6中的变量结构赋值

    小编的上一篇文章更新了es6中关于变量定义的问题,这篇文章继续来一些实用的干货,关于数组.对象的赋值问题.特别是在前后端合作项目的时候,对后端数据的拆分,还有就是对于函数的默认值的惰性赋值问题.看完下 ...

  5. java基础第一节课随笔

    第一题:1.定义一个HelloWold类2.在类中定义主方法3.在主方法中使用输出语句在dos控制台打印HelloWorld 打印结果如:HelloWorld4.在案例中使用当行注释.多行注释添加相关 ...

  6. 深入理解java虚拟机笔记补充-JVM常见参数设置

    JVM 常见参数设置 内存设置 参数 -Xms:初始堆大小,JVM 启动的时候,给定堆空间大小. -Xmx:最大堆大小,如果初始堆空间不足的时候,最大可以扩展到多少. -Xmn:设置年轻代大小.整个堆 ...

  7. 菜鸟刷题路(随缘刷题):leetcode88

    lc88 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int i = m - 1, j = ...

  8. yum安装时提示“尚未安装任何 GPG 公钥,请下载您希望安装的软件签名公钥并安装”

    在Linux操作系统中,安装软件依赖包时,出现了尚未安装任何 GPG 公钥,要求使用rpm --import public.gpg.key导入  问题: [root@server7 yum.repos ...

  9. nacos 实战(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  10. npm ERR! Unexpected end of JSON input while parsing near '...'解决方法

    npm install时出现npm err! Unexpected end of JSON input while parsing near'...'错误 输入  npm cache clean -- ...