Codeforces311 B. Cats Transport(斜率优化dp)

Posted live4m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces311 B. Cats Transport(斜率优化dp)相关的知识,希望对你有一定的参考价值。

题意:

m只猫,p个人
n座山,第i座山和第i-1座山的距离为d[i],人在山1位置.
第i只猫去山h[i],玩到t[i]结束,然后原地等候.
人需要走到h[i]并带走猫,一个人可以同时带无限只猫.
最小化猫的等待时间之和,等待时间指等人的时间.
1<=n,m<=1e5
1<=p<=100

解法:

设 x [ i ] 时 刻 出 发 恰 好 可 以 接 到 猫 i d [ i ] [ j ] 表 示 前 i 个 人 , 带 走 j 只 猫 的 最 小 代 价 d [ i ] [ j ] = m i n { d [ i − 1 ] [ k ] + c o s t [ k + 1 ] [ j ] } c o s t [ k + 1 ] [ j ] = s u m x [ j ] − a [ t ] , t = [ k + 1 , j ] 设 p r e [ ] 为 x [ ] 前 缀 和 c o s t [ k + 1 ] [ j ] = x [ j ] ∗ ( j − k ) − ( p r e [ j ] − p r e [ k ] ) d [ i ] [ j ] = m i n { d [ i − 1 ] [ k ] + x [ j ] ∗ ( j − k ) − ( p r e [ j ] − p r e [ k ] ) } d [ i ] [ j ] = d [ i − 1 ] [ k ] + x [ j ] ∗ j − x [ j ] ∗ k − p r e [ j ] + p r e [ k ] d [ i − 1 ] [ k ] + p r e [ k ] = x [ j ] ∗ k + ( d [ i ] [ j ] − x [ j ] ∗ j + p r e [ j ] ) Y = d [ i − 1 ] [ k ] + p r e [ k ] K = x [ j ] X = k B = d [ i ] [ j ] − x [ j ] ∗ j + p r e [ j ] X 和 K 是 递 增 的 , 可 以 斜 率 优 化 ( p s : Y 也 是 递 增 的 ) 单 调 栈 维 护 点 ( X , Y ) 的 上 凸 包 即 可 设x[i]时刻出发恰好可以接到猫i\\\\ d[i][j]表示前i个人,带走j只猫的最小代价\\\\ d[i][j]=min\\{d[i-1][k]+cost[k+1][j]\\}\\\\ cost[k+1][j]=sum{x[j]-a[t]},t=[k+1,j]\\\\ 设pre[]为x[]前缀和\\\\ cost[k+1][j]=x[j]*(j-k)-(pre[j]-pre[k])\\\\ d[i][j]=min\\{d[i-1][k]+x[j]*(j-k)-(pre[j]-pre[k])\\}\\\\ d[i][j]=d[i-1][k]+x[j]*j-x[j]*k-pre[j]+pre[k]\\\\ d[i-1][k]+pre[k]=x[j]*k+(d[i][j]-x[j]*j+pre[j])\\\\ Y=d[i-1][k]+pre[k]\\\\ K=x[j]\\\\ X=k\\\\ B=d[i][j]-x[j]*j+pre[j]\\\\ X和K是递增的,可以斜率优化(ps:Y也是递增的)\\\\ 单调栈维护点(X,Y)的上凸包即可 x[i]id[i][j]i,jd[i][j]=min{d[i1][k]+cost[k+1][j]}cost[k+1][j]=sumx[j]a[t],t=[k+1,j]pre[]x[]cost[k+1][j]=x[j](jk)(pre[j]pre[k])d[i][j]=min{d[i1][k]+x[j](jk)(pre[j]pre[k])}d[i][j]=d[i1][k]+x[j]jx[j]kpre[j]+pre[k]d[i1][k]+pre[k]=x[j]k+(d[i][j]x[j]j+pre[j])Y=d[i1][k]+pre[k]K=x[j]X=kB=d[i][j]x[j]j+pre[j]XK,(ps:Y)(X,Y)

code:

#include<bits/stdc++.h>
// #define SYNC_OFF
#define int long long
#define ll long long
#define ull unsigned long long
//fast-coding
#define ST(x) x.begin()
#define ED(x) x.end()
#define RST(x) x.rbegin()
#define RED(x) x.end()
#define CL(x) x.clear();
#define all(a,n) a+1,a+1+n
#define ff(i,n) for(ll i=1;i<=n;i++)
#define rff(i,n) for(ll i=n;i>=1;i--)
#define fff(i,n) for(ll i=0;i<n;i++)
#define rfff(i,n) for(ll i=n-1;i>=0;i--)
#define SC(x) scanf("%s",x)
#define SL(x) strlen(x)
#define pss(a) push_back(a)
#define ps(a) push(a)
#define SZ(x) (int)x.size()
#define pee puts("");
#define eee putchar(' ');
#define re readdd()
#define pr(a) printtt(a)
int readdd(){int x=0,f=1;char c=getchar();//
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')f=-1,c=getchar();
while(isdigit(c))x=x*10+c-'0',c=getchar();
return f*x;}
void printtt(int x){if(x<0)putchar('-'),x=-x;//
if(x>=10)printtt(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}//
int ppow(int a,int b,int mod){a%=mod;//
int ans=1%mod;while(b){if(b&1)ans=(long long)ans*a%mod;
a=(long long)a*a%mod;b>>=1;}return ans;}
bool addd(int a,int b){return a>b;}
int lowbit(int x){return x&-x;}
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
bool isdigit(char c){return c>='0'&&c<='9';}
bool Isprime(int x){
    forCF311B Cats Transport题解斜率优化

Codeforces Round #311 (Div. 2)

2017-4-25-Train:Codeforces Round #311 (Div. 2)

2021-5-16 周赛 C-Cats Codeforces Gym 102875C

2021-5-16 周赛 C-Cats Codeforces Gym 102875C

2021-5-16 周赛 C-Cats Codeforces Gym 102875C