【Codeforces Round #185 (Div. 2) D】Cats Transport
【链接】 链接
【题意】
有n座山,m只猫。
每只猫都在其中的一些山上玩。
第i只猫在h[i]山上玩,且会在t[i]时刻出现在山脚下(然后就一直在那里等)
然后有p个人。
它们听从你的安排。
在某个时刻从1号山出发,依次经过每座山,如果有猫在山脚。那么它会顺便把它们带走。
(山与山之间有距离,然后人移动的速度是1单位每秒)
每个人可以无限数量地拿猫。
问你所有猫的总等待时间的最小值是多少。
(人可以在负数的时间出发)
【题解】
把山与山之间的距离求成前缀和。
即d[i]表示1..i之间的距离
然后对于第i只猫,设a[i] = t[i] - d[h[i]];
则a[i]就表示恰好走到h[i]的时候,猫恰好下来,应该从何时从1出发。
按照a[i]升序排一下。
那么
现在相当于,让你在这m只猫里,选连续的p个段。分完所有的m只猫。
且所有猫的等待时间总和最短。
这个可以用区间DP来写。
每个区间里的猫都在区间的右端点的猫的时间出发去取。然后算一下代价就好。
设s[i] = a[1] + a[2] +...+a[i],dp[i][j]表示i个人管了前j只猫的最小值
则dp[i][j] = min{dp[i-1][x] + a[j]*(j-x)-(s[j]-s[x])};
这样的复杂度是
$O(p*m^2)$
考虑斜率优化。
假设x
【错的次数】
在这里输入错的次数
【反思】
在这里输入反思
【代码】
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;
const int P = 1e2;
int n,m,p,d[N+10],a[N+10];
ll s[N+10];
ll dp[P+10][N+10];
int dl[N+10],head,tail;
double ju(int i,int x,int y)
{
return (1.0)*(dp[i-1][y] + s[y] - (dp[i-1][x]+s[x]))/(1.0*(y-x));
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d%d%d",&n,&m,&p);
for (int i = 2;i <= n;i++)
{
scanf("%d",&d[i]);
d[i]+=d[i-1];
}
for (int i = 1;i <= m;i++)
{
int h,t;
scanf("%d%d",&h,&t);
a[i] = t - d[h];
}
sort(a+1,a+1+m);
for (int i = 1;i <= m;i++)
s[i] = s[i-1] + a[i];
for (int i = 0;i <= p;i++)
for (int j = 1;j <= m;j++)
dp[i][j] = 1e17;
dp[0][0] = 0;
for (int i = 1;i <= p;i++)
{
head = 1,tail = 1;
dl[1] = 0;
for (int j = 1;j <= m;j++)
{
while (head < tail && ju(i,dl[head],dl[head+1])<a[j]) head++;
dp[i][j] = min(dp[i][j],dp[i-1][dl[head]] + 1LL*a[j]*(j-dl[head])-(s[j]-s[dl[head]]));
while (head < tail && ju(i,dl[tail-1],dl[tail])>ju(i,dl[tail],j)) tail--;
dl[++tail] = j;
}
}
printf("%lld\n",dp[p][m]);
return 0;
}
【Codeforces Round #185 (Div. 2) D】Cats Transport的更多相关文章
- 【Codeforces Round #185 (Div. 2) C】The Closest Pair
[链接] 链接 [题意] 让你构造n个点,去hack一种求最近点对的算法. [题解] 让x相同. 那么那个剪枝就不会起作用了. [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] # ...
- 【Codeforces Round #185 (Div. 2) B】Archer
[链接] 链接 [题意] 在这里输入题意 [题解] 概率水题. 枚举它是第几轮成功的. 直到满足精度就好 [错的次数] 1 [反思] long double最让人安心. [代码] #include & ...
- 【Codeforces Round #185 (Div. 2) A】 Whose sentence is it?
[链接] 链接 [题意] 告诉你每句话; 然后每句话是谁说的和开头与结尾的一段字符串有关. [题解] 一个一个判断就好; 注意大小<5的情况 [错的次数] 在这里输入错的次数 [反思] 在这里输 ...
- 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers
[链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...
- 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes
[题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...
- 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees
[题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...
- 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory
[题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...
- 【Codeforces Round #423 (Div. 2) C】String Reconstruction
[Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...
- 【Codeforces Round #423 (Div. 2) B】Black Square
[Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...
随机推荐
- 搭建并配置本地GitLab服务器教程
由于工作单位不一定能够方便使用外部网络,现以下载rpm包来搭建一套本地GitLab服务器. 1. 系统准备 系统:redhat 7.3 2. 下载所需安装包 去官网下rpm包,下载地址,ce是免费的社 ...
- MyBatis学习总结(11)——MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...
- HTML中行内元素与块级元素有哪些及区别
二.行内元素与块级元素有什么不同? 块级元素和行内元素的区别是,块级元素会占一行显示,而行内元素可以在一行并排显示. 通过样式控制,它们可以相互转换. 1.尺寸-块级元素和行内元素之间的一个重要的不同 ...
- 怎样使用 OneAPM 监控微软 Azure Cloud Service ?
不知不觉微软 Azure 已经进入中国市场近两年的时间.那么 Azure 平台的性能到底怎样?资源载入的延迟.虚拟机的稳定性等问题是否切实满足客户期许.这些都是大家对微软 Azure 这个国外的云服务 ...
- 1.20 Python基础知识 - python常用模块-1
一.time和datetime 1.time模块 1)time.process_time() >>> import time >>> time.process_ti ...
- collapse折叠
基本: <button class="btn btn-primary" data-toggle="collapse" data-target=" ...
- call、apply、bind 区别
1.为什么要用 call .apply? 为了 改变方法里面的属性而不去改变原来的方法 function fruits() {} fruits.prototype = { color: "r ...
- JS/CSS 在屏幕底部弹出消息
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- BZOJ2631: tree(LCT)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
- Mybaits中session的应用一
获取一级缓存session SqlSession session = this.yangchebaoDbManagerImpl.getSqlSessionFactory().openSession(f ...