CF311B-Cats Transport【斜率优化dp】
正題
題目鏈接:https://www.luogu.com.cn/problem/CF311B
題目大意
nnn座山在一條線上,有mmm只貓,第iii只從tit_iti?開始在第xix_ixi?座山上游玩結束。
派ppp個人在不同時間從111走到nnn接走所有游玩結束的貓,求所有貓的最小等待時間。
解題思路
對于一只貓iii,就是要求從ti?∑j=1xidjt_i-\sum_{j=1}^{x_i}d_jti??∑j=1xi??dj?時刻出發才可以接到。后文直接讓ti=ti?∑j=1xidjt_i=t_i-\sum_{j=1}^{x_i}d_jti?=ti??∑j=1xi??dj?。排序后求一個前綴和sss以方便后面計算。
那么我們肯定是直接接連續的一段tit_iti?來接,我們設fi,jf_{i,j}fi,j?表示到第iii個人,接送了前jjj只貓時的最小等待時間和。那么有轉移方程fi=min{fj+ti(i?j)?(si?sj)}f_i=min\{f_{j}+t_i(i-j)-(s_i-s_j)\}fi?=min{fj?+ti?(i?j)?(si??sj?)}
fi?si?tii=fj?tij+sjf_i-s_i-t_ii=f_j-t_ij+s_jfi??si??ti?i=fj??ti?j+sj?
設兩個j,k(j>k)j,k(j>k)j,k(j>k)中的jjj優于kkk
fj?tij+sj<fk?tik+skf_{j}-t_ij+s_j<f_k-t_ik+s_kfj??ti?j+sj?<fk??ti?k+sk?
設zi=fi+siz_i=f_i+s_izi?=fi?+si?
zj?zk<ti(j?k)z_j-z_k<t_i(j-k)zj??zk?<ti?(j?k)
zj?zkj?k<ti\frac{z_j-z_k}{j-k}<t_ij?kzj??zk??<ti?
斜率優化即可,時間復雜度O(np)O(np)O(np)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10; ll n,m,p,d[N],t[N],f[101][N],s[N],z[N],q[N]; int main() {scanf("%lld%lld%lld",&n,&m,&p);for(ll i=2;i<=n;i++)scanf("%lld",&d[i]),d[i]+=d[i-1];for(ll i=1;i<=m;i++){ll x;scanf("%lld%lld",&x,&t[i]);t[i]-=d[x];}sort(t+1,t+1+m);memset(f,0x3f,sizeof(f));f[0][0]=0;for(ll i=1;i<=m;i++)s[i]=s[i-1]+t[i];for(ll i=1;i<=p;i++){ll l=1,r=1;q[1]=0;for(ll j=1;j<=m;j++)z[j]=f[i-1][j]+s[j];for(ll j=1;j<=m;j++){while(l<r&&z[q[l+1]]-z[q[l]]<=t[j]*(q[l+1]-q[l]))l++;f[i][j]=min(f[i-1][j],z[q[l]]-s[j]+(j-q[l])*t[j]); if(z[j]>=0x3f3f3f3f3f3f3f3fll)continue;while(l<r&&(z[j]-z[q[r]])*(q[r]-q[r-1])<=(z[q[r]]-z[q[r-1]])*(j-q[r]))r--;q[++r]=j;}}printf("%lld",f[p][m]);return 0; }總結
以上是生活随笔為你收集整理的CF311B-Cats Transport【斜率优化dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: catia对电脑配置要求(catia对电
- 下一篇: Win10电脑怎么查看配置(win10电