运输小猫
题目传送门
考虑每只小猫是否能被接到、等待时间,其实在于
#include<bits/stdc++.h>
using namespace std;
#define L(i,l,r) for(int i=l;i<=r;++i)
#define R(i,l,r) for(int i=r;i>=l;--i)
const int N=100010,M=100010,P=110;
typedef long long ll;
int n,m,p,q[M],d[N],a[M];
ll f[P][M],s[M];
#define get_y(j,k) (f[(j)-1][(k)]+s[(k)])
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
scanf("%d%d%d",&n,&m,&p);
L(i, 2, n){
scanf("%lld",d+i);
d[i]+=d[i-1];
}
L(i,1,m){
int h,t;
scanf("%d%d",&h,&t);
if((ll)t-(ll)h>=INT_MAX||(ll)t-(ll)h<=INT_MIN){
printf("%d %d\n",t,h);
}
a[i]=t-d[h];
}
sort(a+1,a+1+m);
L(i, 1, m)s[i]=s[i-1]+1ll*a[i];
memset(f,0x3f,sizeof f);
L(i, 0, p)f[i][0]=0;
L(j, 1, p){
int hh=0,tt=0;
L(i, 1, m){
while(hh<tt&&(get_y(j,q[hh+1])-get_y(j,q[hh]))<=1ll*a[i]*(q[hh+1]-q[hh]))++hh;
int k=q[hh];
f[j][i]=f[j-1][k]+1ll*a[i]*(i-k)-(s[i]-s[k]);
while(hh<tt&&(get_y(j,q[tt])-get_y(j,q[tt-1]))*(i-q[tt])>=(get_y(j,i)-get_y(j,q[tt]))*(q[tt]-q[tt-1]))--tt;
q[++tt]=i;
}
}
printf("%lld",f[p][m]);
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17363169.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步