PS:如果读过题了可以跳过题目描述直接到题解部分
提交链接:洛谷 CF311B Cats Transport

题目

题目描述

Zxr960115 is owner of a large farm. He feeds mmm cute cats and employs ppp feeders. There’s a straight road across the farm and nnn hills along the road, numbered from 1 to nnn from left to right. The distance between hill iii and (i−1)(i-1)(i−1) is did_{i}di​ meters. The feeders live in hill 1.

One day, the cats went out to play. Cat iii went on a trip to hill hih_{i}hi​ , finished its trip at time tit_{i}ti​ , and then waited at hill hih_{i}hi​ for a feeder. The feeders must take all the cats. Each feeder goes straightly from hill 1 to nnn without waiting at a hill and takes all the waiting cats at each hill away. Feeders walk at a speed of 1 meter per unit time and are strong enough to take as many cats as they want.

For example, suppose we have two hills (d2=1)(d_{2}=1)(d2​=1) and one cat that finished its trip at time 3 at hill 2 (h1=2)(h_{1}=2)(h1​=2) . Then if the feeder leaves hill 1 at time 2 or at time 3, he can take this cat, but if he leaves hill 1 at time 1 he can’t take it. If the feeder leaves hill 1 at time 2, the cat waits him for 0 time units, if the feeder leaves hill 1 at time 3, the cat waits him for 1 time units.

Your task is to schedule the time leaving from hill 1 for each feeder so that the sum of the waiting time of all cats is minimized.

输入格式

The first line of the input contains three integers n,m,pn,m,pn,m,p (2≤n≤105,1≤m≤105,1≤p≤100)(2 \le n\le 10^5,1 \le m \le 10^5, 1\le p \le 100)(2≤n≤105,1≤m≤105,1≤p≤100).

The second line contains n−1n-1n−1 positive integers d2,d3,...,dnd_{2},d_{3},...,d_{n}d2​,d3​,...,dn​ (1≤di<104).(1 \le d_{i} < 10^{4}) .(1≤di​<104).

Each of the next mmm lines contains two integers hih_ihi​ and tit_iti​ (1≤hi≤n,0≤ti≤109)(1 \le h_i \le n,0 \le t_i \le 10^9)(1≤hi​≤n,0≤ti​≤109).

输出格式

Output an integer, the minimum sum of waiting time of all cats.

Please, do not write the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

题意翻译

Zxr960115 是一个大农场主。

他养了 mmm 只可爱的猫子,雇佣了 ppp 个铲屎官。这里有一条又直又长的道路穿过了农场,有 nnn 个山丘坐落在道路周围,编号自左往右从 111 到 nnn。山丘 iii 与山丘 i−1i-1i−1 的距离是 DiD_iDi​ 米。铲屎官们住在 111 号山丘。

一天,猫子们外出玩耍。猫子 iii 去山丘 HiH_iHi​ 游玩,在 TiT_iTi​ 时间结束他的游玩,然后在山丘 HiH_iHi​ 傻等铲屎官。铲屎官们必须把所有的猫子带上。每个铲屎官直接从 H1H_1H1​ 走到 HnH_nHn​,中间不停下,可以认为不花费时间的把游玩结束的猫子带上。每个铲屎官的速度为一米每单位时间,并且足够强壮来带上任意数量的猫子。

举个栗子,假装我们有两个山丘( D2=1D_2=1D2​=1 ),有一只猫子,他想去山丘 222 玩到时间 333。然后铲屎官如果在时间 222 或者时间 333 从 111 号山丘出发,他就能抱走猫子。如果他在时间 111 出发那么就不行(猫子还在玩耍)。如果铲屎官在时间 222 出发,猫子就不用等他(ΔT=0\Delta T=0ΔT=0)。如果他在时间 333 出发,猫子就要等他 111 个单位时间。

你的任务是安排每个铲屎官出发的时间(可以从 0 时刻之前出发),最小化猫子们等待的时间之和。

对于全部的数据,满足 2≤n≤1052\le n\le10^52≤n≤105,1≤m≤1051\le m\le10^51≤m≤105,1≤p≤1001\le p\le1001≤p≤100,1≤Di<1041\le D_i<10^41≤Di​<104,1≤Hi≤n1\le H_i\le n1≤Hi​≤n,0≤t≤1090\le t\le10^90≤t≤109。

样例 #1

样例输入 #1

4 6 2
1 3 5
1 0
2 1
4 9
1 10
2 10
3 12

样例输出 #1

3

题解

对于这道题,我们应该很容易能想出纯暴力的解法。

首先对每只猫有影响的只有多久从第一个山丘出发能刚好接到他,所以先把所有的山丘的距离和猫的玩耍时间都转化为多久去接猫。

3pts

至于纯暴力解法当然是直接深搜每一个人的出发时间找到猫咪等待总时间的最小值。但有些情况是完全没有必要枚举的,比如当一个人出去却不能恰好接到任何一只猫时,因为他完全可以早一点出去,恰好接到一些猫,这时他接到的猫和之前是完全一样的,而且还可以让那一群猫少等一段时间

100pts

毕竟纯暴力只能得三分,我们还是废话少说,直接上正解。

深搜当然是行不通的,我们可以先考虑一下dp转移:
为了方便书写,我先重新定义几个数组:did_idi​表示第iii个山丘距离第111个山丘的距离;xi=ti−dix_i=t_i-d_ixi​=ti​−di​,即恰好接到第iii只猫需要从第111个山丘出发的时间;si=Σj=1ixjs_i=\Sigma_{j=1}^{i}x_jsi​=Σj=1i​xj​,即sss维护xxx的前缀和。

fi,j=mink=1j−1(fi−1,k+Σl=k+1j(xj−xl)f_{i,j}=min_{k=1}^{j-1}(f_{i-1,k}+\Sigma_{l=k+1}^j(x_j-x_l)fi,j​=mink=1j−1​(fi−1,k​+Σl=k+1j​(xj​−xl​)

我们暂且忽略一下取最小值的步骤,然后来转化一下这个转移方程:

fi,j=fi−1,k+(j−k)×xj−sj+skf_{i,j}=f_{i-1,k}+(j-k)\times x_j-s_j+s_kfi,j​=fi−1,k​+(j−k)×xj​−sj​+sk​
fi,j=fi−1,k+j×xj−k×xj+sk−sjf_{i,j}=f_{i-1,k}+j\times x_j-k\times x_j+s_k-s_jfi,j​=fi−1,k​+j×xj​−k×xj​+sk​−sj​
我们再将所有与kkk有关的式子移到等号左边,所有其他式子移到等号右边:
fi−1,k+sk=xj×k+sj+fi,j−j×xjf_{i-1,k}+s_k=x_j\times k+s_j+f_{i,j}-j\times x_jfi−1,k​+sk​=xj​×k+sj​+fi,j​−j×xj​
然后我们可以代入y=kx+by=kx+by=kx+b:

yyy kkk xxx bbb
fi−1,k+skf_{i-1,k}+s_kfi−1,k​+sk​ xjx_jxj​ kkk sj+fi,j−j×xjs_j+f_{i,j}-j\times x_jsj​+fi,j​−j×xj​

斜率的单调性应该不用证明了吧,就xjx_jxj​直接排序以后往里面加,就显然单调了嘛。

然后我们用单调栈维护一个凸包,这个凸包满足两个性质,首先一定是凸包的斜率单调性,然后是凸包的最左边的斜率被xjx_jxj​访问过以后就可以删掉,因为xjx_jxj​单增,所以这条线与凸包的切点一定不在上一条线的左边,我们在下一次搜的时候就可以不用考虑前面的点了。在这种情况下,每个kkk只会被访问一遍,于是效率就可以降成O(pm)O(pm)O(pm)了。

代码实现

3pts

//洛谷 CF311B Cats Transport
#pragma GCC optimize(3)
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,p;
int d[100010];//与1的距离
int h[100010],t[100010];
int x[100010];//t-d
int s[100010];//离散化
int cnt;
int y[100010];//前缀和
int z[100010];//前缀和的前缀和
int id;
int a[100010];void re(int &x){int nt;x=0;while(!isdigit(nt=getchar()));x=nt^'0';while(isdigit(nt=getchar())){x=(x<<3)+(x<<1)+(nt^'0');}
}long long dfs(int w,int j){a[j]=w;if(j==p||w==1){long long ans=z[a[j]];for(int i=j-1;i>=1;--i){ans+=z[a[i]]-(s[a[i]]-s[a[i+1]])*y[a[i+1]];}return ans;}long long ans=1e18;for(int i=w-1;i>=1;--i){ans=min(ans,dfs(i,j+1));}return ans;
}int main(){register int i;re(n),re(m),re(p);for(i=2;i<=n;++i){re(d[i]);d[i]+=d[i-1];}for(i=1;i<=m;++i){re(h[i]),re(t[i]);s[i]=x[i]=t[i]-d[h[i]];}sort(s+1,s+m+1);cnt=unique(s+1,s+m+1)-s-1;for(i=1;i<=m;++i){id=lower_bound(s+1,s+cnt+1,x[i])-s;++y[id];}for(i=1;i<=cnt;++i){y[i]+=y[i-1];z[i]=z[i-1]+y[i-1]*(s[i]-s[i-1]);}printf("%lld\n",dfs(cnt,1));return 0;
}

100pts

//洛谷 CF311B Cats Transport
#pragma GCC optimize(3)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
long long n,m,p;
long long d[100010];//与1的距离
long long h,t;
long long x[100010];//t-d
long long s[100010];//x的前缀和
int q[100010];//单调队列
long long f[150][100010];
int head,tail;void re(long long &x){int nt;x=0;while(!isdigit(nt=getchar()));x=nt^'0';while(isdigit(nt=getchar())){x=(x<<3)+(x<<1)+(nt^'0');}
}int main(){register int i,j;re(n),re(m),re(p);for(i=2;i<=n;++i){re(d[i]);d[i]+=d[i-1];}for(i=1;i<=m;++i){re(h),re(t);x[i]=t-d[h];}sort(x+1,x+1+m);memset(f,0x3f3f3f3f,sizeof(f));for(i=1;i<=m;++i){s[i]=s[i-1]+x[i];}f[0][0]=0;for(i=1;i<=p;++i){head=1;tail=1;q[1]=0;for(j=1;j<=m;++j){while(head<tail&&1ll*f[i-1][q[head+1]]+s[q[head+1]]-f[i-1][q[head]]-s[q[head]]<=1ll*x[j]*(q[head+1]-q[head])){++head;}f[i][j]=f[i-1][q[head]]+(j-q[head])*x[j]+s[q[head]]-s[j];while(head<tail&&1ll*(f[i-1][j]+s[j]-f[i-1][q[tail]]-s[q[tail]])*(q[tail]-q[tail-1])<=1ll*(f[i-1][q[tail]]+s[q[tail]]-f[i-1][q[tail-1]]-s[q[tail-1]])*(j-q[tail])){--tail;}q[++tail]=j;}}printf("%lld\n",f[p][m]);return 0;
}

洛谷 CF311B Cats Transport相关推荐

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

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

  2. 洛谷 P5306 [COCI2019] Transport 题解

    题目大意: 在一棵树中,找出满足条件的点对 , 数量,使从  能走到 ,其中任意时刻,满足点权之和大于等于边权之和. 算法分析: 看题目的描述,很明显是一道点分治的题目.关键在于如何去维护答案. 这道 ...

  3. CF311B Cats Transport(斜率优化)

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

  4. 广度优先搜索——Corn Maze S(洛谷 P1825)

    题目选自洛谷P1825 题目比较长,但是不难理解.因为求的是一个最短距离,所以用BFS即可. 广搜的主要思想便是将所有可行解(可到达的点)放入队列,然后再一个个遍历所有可行解(可到达的点),知道找到终 ...

  5. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  6. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  7. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  8. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  9. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

最新文章

  1. 【BZOJ 2460 元素】
  2. mac版sublime 无法下载插件(Vue 代码无高亮问题)
  3. bzoj 3679: 数字之积
  4. Kotlin 基本数据类型(五)
  5. 瑞星力荐金山毒霸 原来是广告程序 作崇
  6. linux设备驱动程序第10章,linux中秒字符设备驱动(宋宝华设备驱动开发详解第10章)...
  7. java共享汽车租赁系统
  8. html lab颜色,颜色标准LAB值对照表
  9. [Linux 基础] -- Linux 之 fstab 文件详解
  10. KDD 2022 | 美团技术团队精选论文解读
  11. 简单的下拉导航条代码
  12. Javashop多用户商城系统源码 云表-无代码开发平台 框架源码
  13. CyberCat赛博猫,进阶版AXIE
  14. Word:外国人名字字母上加撇,怎么输入
  15. check 和nocheck
  16. 推特正式起诉马斯克 要求强制其按原协议完成收购
  17. ps制作双重曝光海报
  18. Javafx+MySQL 学生成绩管理系统
  19. 4t硬盘实际容量是多少_怎么对大容量硬盘(例如4T硬盘)进行查看并分区
  20. 前端终端组件xterm.js的使用(转)

热门文章

  1. 鸭子的应聘,我是学c++的
  2. 2、TWS API接口的使用说明
  3. TWS耳机无线充电仓
  4. VSCode C++环境配置及测试运行
  5. matlab线性代数(diag)
  6. 【毕业季·进击的技术er】一个读研学生的唠唠嗑
  7. AWS 再次发生宕机事件,云时代下的我们该如何补救?
  8. JavaScript 随机正数或负数
  9. web-view和runtime.openURL的方式进行外部链接
  10. html 输入框联动显示,js下拉选择框与输入框联动实现添加选中值到输入框的方法...