CF311B Cats Transport

暑假到现在终于过了这道题.

首先计算出\(A[]\),\(A[i]\)表示如果有一个饲养员在\(A[i]\)时刻出发,那么刚好使第\(i\)只猫无需等待地被接走.

发现\(A[]\)与猫的编号无关,对其排序并求前缀和\(S[]\).

设\(F[i,j]\)表示前\(i\)个饲养员接走了前\(j\)只猫的最小等待时间和.

朴素算法有:

\[F[i,j]=\min_{k<j}(F[i-1,k]+A[j]\times (j-k)-(S[j]-S[i])) \]

分别枚举\(i,j,k\),时间复杂度\(O(n^3)\).

考虑对最内层DP进行斜率优化,此时把与\(i,j\)相关的式子视为常量,把\(k\)视为变量,去掉\(\min\)函数,把状态转移方程变形,有:

\[F[i-1,k]+S[k]=A[j]\times k+F[i,j]-A[j]\times j+S[j] \]

令:

\[y=F[i-1,k]+S[k] \]
\[x=k \]
\[b=F[i,j]-A[j]\times j+S[j] \]

那么有\(y=A[j]\times x+b\)

容易发现这是一个一次函数,一但\(x\)确定,则可以在坐标轴中画出对应的点.换句话说,每一个\(k\)对应的是一个点.这些点的横坐标是单增的,因为\(j\)是从\(1...m\)的.

我们想让\(F[i,j]\)最小,就是让\(b\)最小,也就是让纵截距最小.而斜率\(A[j]\)是确定的显然在所有点中,只有下凸壳上的点可能使纵截距出现最小值.所以我们维护下凸壳.

下凸壳上的哪个点会使纵截距出现最小值呢?如果记\(slope(i,j)\)表示点\(i\)与点\(j\)连线的斜率,那么:

\[slope(i-1,i)<=A[j],slope(i,i+1)>=A[j](*) \]

的点会使纵截距出现最小值.

本题中,\(A[j]\)单增,所以可以用单调队列维护这个下凸壳.队首出队的条件是:队首两点间斜率\(<A[j]\),因为\(A[j]\)单增,而这两点斜率又\(<A[j]\),那么队首的点无论如何不可能成为满足\(*\)式的最优情况.

从队尾入队的条件是:能形成下凸壳.

#include<bits/stdc++.h>
const int SIZE=100005; int In()
{
char ch=getchar();
int x=0;
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
} int n,m,p,h,Tim,sum_D[SIZE];
int A[SIZE];
long long DP[105][SIZE],sum_A[SIZE];
int q[SIZE],L,R; int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=2;i<=n;i++)
sum_D[i]=sum_D[i-1]+In();
for(int i=1;i<=m;i++)
{
h=In();Tim=In();
A[i]=Tim-sum_D[h];
}
std::sort(A+1,A+1+m);
for(int i=1;i<=m;i++)sum_A[i]=sum_A[i-1]+A[i];
memset(DP,0x3F,sizeof(DP));
DP[0][0]=0;
for(int i=1;i<=p;i++)
{
L=R=1;
q[1]=0;
#define G(x) (DP[i-1][x]+sum_A[x])
#define S(A,B) (double)(G(B)-G(A))/(double)(B-A)
for(int k=1;k<=m;k++)
{
while( L<R && S(q[L],q[L+1]) <= 1.0*A[k] )L++;
DP[i][k]=DP[i-1][q[L]]+1LL*A[k]*(k-q[L])-(sum_A[k]-sum_A[q[L]]);
while( L<R && S(q[R-1],q[R]) >= S(q[R],k) )R--;
q[++R]=k;
}
}
std::cout<<DP[p][m];
return 0;
}

斜率优化 DP的更多相关文章

  1. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  2. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  3. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  4. 【BZOJ-1096】仓库建设 斜率优化DP

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Stat ...

  5. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  6. BZOJ 3156: 防御准备 斜率优化DP

    3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...

  7. HDU2829 Lawrence(斜率优化dp)

    学了模板题之后上网搜下斜率优化dp的题目,然后就看到这道题,知道是斜率dp之后有思路就可以自己做不出来,要是不事先知道的话那就说不定了. 题意:给你n个数,一开始n个数相邻的数之间是被东西连着的,对于 ...

  8. HDU3507 Print Article(斜率优化dp)

    前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...

  9. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  10. 斜率优化dp(POJ1180 Uva1451)

    学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...

随机推荐

  1. 【5min+】后台任务的积木。.NetCore中的IHostedService

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  2. centos7安装Elasticsearch及Es-head插件详细教程(图文)

    懒惰了很久,今天来写一下Elasticsearch在centos7上安装教程以及安装过程中可能出现的报错解决方式,有不对的地方,烦请各位看官多多指教! 一.ES安装 1.环境检查 确保有java环境, ...

  3. 刷题85. Maximal Rectangle

    一.题目说明 题目,85. Maximal Rectangle,计算只包含1的最大矩阵的面积.难度是Hard! 二.我的解答 看到这个题目,我首先想到的是dp,用dp[i][j]表示第i行第j列元素向 ...

  4. git系列之---码云gitee 添加SHH公钥

    公钥 很多服务器都是需要认证的,SHH 认证是其中的一种:在客户端生成公钥,把生成的公钥添加到服务器,你以后连接服务器的时候就不用每次都输入用户名和密码了:很多git服务器都是用ssh认证方式,你需要 ...

  5. 「Flink」Flink的状态管理与容错

    在Flink中的每个函数和运算符都是有状态的.在处理过程中可以用状态来存储数据,这样可以利用状态来构建复杂操作.为了让状态容错,Flink需要设置checkpoint状态.Flink程序是通过chec ...

  6. Lucene之索引库的维护:添加,删除,修改

    索引添加 Field域属性分类 添加文档的时候,我们文档当中包含多个域,那么域的类型是我们自定义的,上个案例使用的TextField域,那么这个域他会自动分词,然后存储 我们要根据数据类型和数据的用途 ...

  7. 在pycharm中如何设置代码对齐竖线

    方法:启动pycharm软件,打开一个文件,点 file 菜单,选择 settings,在弹出的setting菜单中依次选择editor-->general-->appearance,然后 ...

  8. 安装Nginx到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:nginx-1.12.2 硬件要求:无 安装过程 1.配置YUM源 [root@localhost ~]# r ...

  9. Elasticsearch分布式架构

    Reference 1. http://solutionhacker.com/elasticsearch-architecture-overview/ 2. https://github.com/ba ...

  10. ArcGIS Server 地图服务,查询出错 Error performing query operation

    Error: Error performing query operation Error Message Querying a layer from a Map Service that retur ...