Cats Transport

现在有n座山,第i座山的坐标为\(d_i\),初始p个饲养员在山1,有m只猫,每只猫有一个属性\(h_i,t_i\)表示猫i

在\(h_i\)以及它在\(t_i\)时间后才能被带走(\(t_i\)之前不算做在等待),现在请安排饲养员的出发时间,每个饲养员的速度都为每个单位长度每个单位时间,让所有的猫被带走之前的等待时间之和最短。

\(2<=n<=10^5,1<=m<=10^5,1<=p<=100\)

注意到饲养员的出发时间是不可能作为状态的,现在让d变为其前缀和,设一个饲养员的出发时间为t,于是考虑等待时间对于一只猫i的等待时间应为\(t+d_{h_i}-t_i\),注意到猫要能够被饲养员带走,必然有\(t+d_{h_i}\geq t_i\),也即\(t\geq t_i-d_{h_i}\),于是为了简单判断猫是否能被带走,我们应该维护一个\(g_i=t_i-d_{h_i}\),为了便于判断一个饲养员能带走哪些猫,我们自然要排序,于是现在即发现问题即哪些连续的猫被哪个饲养员带走,于是问题被转化成了任务安排。

因此设\(f[i][j]\)表示前i个饲养员,带走前j只猫的最少等待时间,设s为g的前缀和,不难有

\[f[i][j]=f[i-1][k]_{0\leq k< i}+\sum_{l=k+1}^j(g_j-g_l)
\]

边界:\(f[0][0]=0\),其余无限大

经整理,它的斜率优化式应为

\[s_k+f[i-1][k]=kg_j+f[i][j]-jg_j+s_j
\]

发现k是递增的,而g也是递增的,于是我们只要用单调队列维护斜率,在按斜率关系弹掉队首,答案取队首即可,时间复杂度易知\(O(np)\)。

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define il inline
#define ri register
#define Size 200050
#define ll long long
using namespace std;
int T[Size],L,R;
ll s[Size],a[Size],sa[Size],dp[101][Size],y[Size];
template<class free>il void read(free&);
int main(){
int n,m,p;read(n),read(m),read(p);
for(int i(2);i<=n;++i)read(s[i]),s[i]+=s[i-1];
for(int i(1),j,k;i<=m;++i)read(j),read(k),a[i]=k-s[j];
sort(a+1,a+m+1);for(int i(1);i<=m;++i)sa[i]=sa[i-1]+a[i];
memset(dp,1,sizeof(dp)),dp[0][0]=0;
for(int i(1),j;i<=p;++i){L=R=1;
for(j=1;j<=m;++j){y[j]=dp[i-1][j]+sa[j];
while(L<R&&(y[T[L+1]]-y[T[L]])<=a[j]*(T[L+1]-T[L]))++L;
dp[i][j]=dp[i-1][T[L]]+(j-T[L])*a[j]-sa[j]+sa[T[L]];
while(L<R&&(y[T[R]]-y[T[R-1]])*(j-T[R])
>=(y[j]-y[T[R]])*(T[R]-T[R-1]))--R;T[++R]=j;
}}printf("%lld",dp[p][m]);
return 0;
}
template<class free>
il void read(free &x){
x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

最新文章

  1. ie6兼容问题汇总
  2. C# StreamReader
  3. Osmocom-BB中cell_log的多种使用姿势
  4. sql server2005 实现读写分离
  5. Codevs 1958 刺激
  6. Django REST Framework学习&mdash;&mdash;Android使用REST方法访问Diango
  7. 【SpringBoot】服务器端主动推送SSE技术讲解
  8. 剥开比原看代码12:比原是如何通过/create-account-receiver创建地址的?
  9. Bootstrap 3 媒体查询
  10. 正则前面的 (?i) (?s) (?m) (?is) (?im)
  11. SDN 期末作业验收
  12. 005_ss-link.info的ping探测工具
  13. 项目通过https访问的tomcat相关配置
  14. iOS开发-16进制颜色转换
  15. Unity3D笔记 愤怒的小鸟&lt;四&gt; 实现Selelction界面
  16. Codeforces 832D - Misha, Grisha and Underground
  17. 3.3 建立松耦合组件(MVC 模式最重要的特性之一是它支持、关注“分离”)《精通 ASP.NET MVC 5》 推荐指数:8 星半
  18. spark 资源参数调优
  19. C语言:九九乘法表打印
  20. ceph: health_warn clock skew detected on mon的解决办法

热门文章

  1. Linux 下通过mail命令发送邮件
  2. 通过java api 读取sql 中数据(查询)
  3. Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug
  4. C#获取系统服务+进程+启动时间
  5. 伪类checked
  6. 多渠道打包工具Walle源码分析
  7. Mongodb安装遇到的问题
  8. Spring常见面试题及答案解析
  9. Servlet中的Filter怎么使用?
  10. 获取Delphi焦点所在的控件及通过控件名称访问控件