ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Cats Transport

2019-06-12 09:03:15  阅读:375  来源: 互联网

标签:ch 山丘 Cats 时间 include 饲养员 出发 Transport


CF

洛咕

Vjudge

题意:小S是一个大农场主.他养了m只可爱的猫,雇佣了p个饲养员.农场中有一条笔直的路,路边有N座山,从1到N编号.山丘i与山丘i-1的距离是\(d_i\)米.饲养员都住在1号山丘.一天,猫外出玩耍.猫i去山丘\(h_i\)游玩,在\(t_i\)时间结束他的游玩,然后在原地傻等饲养员.饲养员必须把所有的猫带回.每个饲养员直接从1号山走到N号山,不花费时间的把已经游玩结束的猫带回.每个铲屎官的速度为一米每单位时间,并且足够强壮来带上任意数量的猫.举个栗子,假装我们有两个相距为1的山丘,有一只猫,他想去山丘2玩到时间3.然后饲养员如果在时间2或者时间3从1号山丘出发,他就能抱走猫.如果他在时间1出发那么就不行(猫子还在玩耍).如果饲养员在时间2出发,猫就不用等他(ΔT=0).如果他在时间3出发,猫就要等他1个单位时间。你的任务是安排每个饲养员出发的时间,最小化所有猫等待的时间之和.

分析:对于每只猫,设\(A[i]=t[i]-\sum_{j=1}^{h[i]}d[j]\),一名饲养员如果想接到第i只猫,就必须要在\(A[i]\)时刻之后从1号山出发.若出发时刻为t,则猫的等待时间就是\(t-A[i]\)

预处理出A数组,并从小到大排序,这样一个饲养员接走的猫一定是连续的一群,这样本题就是斜率优化的模板题了.

设\(f[i][j]\)表示前i个饲养员接走前j只猫的最小等待时间,则有,

\(f[i][j]=f[i-1][k]+A[j]*(j-k)-(S[j]-S[k])\)其中S数组是A数组排好序后的前缀和数组

设l<k且k比l更优,即

\(f[i-1][k]+A[j]*(j-k)-(S[j]-S[k])<f[i-1][l]+A[j]*(j-l)-(S[j]-S[l])\)

整理一下上式得到,

\(\frac{f[i-1][k]+S[k]-f[i-1][l]-S[l]}{k-l}<A[j]\)

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
inline int read(){
   int s=0,w=1;char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
   return s*w;
}
const int N=200005;
const int M=100005;
int d[N],h[M],t[M],q[N];
LL D[N],sum[M],a[M],f[105][M];
int main(){
    int n=read(),m=read(),p=read();
    for(int i=2;i<=n;i++){
        d[i]=read();
        D[i]=D[i-1]+d[i];
    }
    for(int i=1;i<=m;i++){
        h[i]=read();t[i]=read();
        a[i]=t[i]-D[h[i]];
    }
    sort(a+1,a+m+1);
    for(int i=1;i<=m;i++)sum[i]=sum[i-1]+a[i];
    memset(f,0x3f,sizeof(f));
    for(int i=0;i<=p;i++)f[i][0]=0;
    for(int i=1;i<=p;i++){
        int l=1,r=1;q[1]=0;
        for(int j=0;j<=m;j++){
            while(l<r&&(f[i-1][q[l+1]]+sum[q[l+1]])-(f[i-1][q[l]]+sum[q[l]])<=(q[l+1]-q[l])*a[j])l++;
            f[i][j]=f[i-1][q[l]]+sum[q[l]]+a[j]*j-sum[j]-a[j]*q[l];
            while(l<r&&((f[i-1][q[r]]+sum[q[r]])-(f[i-1][q[r-1]]+sum[q[r-1]]))*(j-q[r])>=((f[i-1][j]+sum[j])-(f[i-1][q[r]]+sum[q[r]]))*(q[r]-q[r-1]))r--;
            q[++r]=j;
        }
    }
    printf("%lld\n",f[p][m]);
    return 0;
}

标签:ch,山丘,Cats,时间,include,饲养员,出发,Transport
来源: https://www.cnblogs.com/PPXppx/p/11007525.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有