CF724E Goods transportation
Goods transportation
有 𝑛 座城市,第 𝑖 座城市会生产 𝑝𝑖 商品,可以卖出 𝑠𝑖 商品。
对于一对城市 𝑖,𝑗(𝑖 < 𝑗),𝑖 可以向 𝑗 运输不超过 𝑐(对于所有 𝑖,𝑗 均相同)的商品。
求最多能卖出多少商品。
𝑛 ≤ 10000。
题解
显然有一个网络流模型,源点向第 𝑖 个点连容量为 𝑝𝑖 的边,第 𝑖 个点向汇点连容量为 𝑠𝑖 的边,第 𝑖 个点向第 𝑗 (𝑖 < 𝑗) 个点连容量为 𝑐 的边,求个最大流。
但是跑得很慢。
考虑最大流等于最小割。
𝑓[𝑖][𝑗] 表示前 𝑖 个点,有 𝑗 个点属于 𝑆 集合的最小割为多少。
枚举第 𝑖 个点属于 𝑆 集还是 𝑇 集转移。属于\(S\)集合只需要断它连向\(T\)的边,属于\(T\)集合不仅要断\(S\)连向它的边,还要断前面属于\(S\)集合的点连向它的边。
复杂度 𝑂(𝑛2)。
CO int N=1e4+10;
CO int64 inf=1e18;
int64 c,s[N],t[N];
int64 dp[2][N];
int main(){
int n=read<int>();
read(c);
for(int i=1;i<=n;++i) read(s[i]);
for(int i=1;i<=n;++i) read(t[i]);
for(int i=1;i<=n;++i){
dp[i&1][0]=dp[(i-1)&1][0]+s[i],dp[i&1][i+1]=inf;
for(int j=1;j<=i;++j)
dp[i&1][j]=min(dp[(i-1)&1][j]+c*j+s[i],dp[(i-1)&1][j-1]+t[i]);
}
int64 ans=inf;
for(int i=0;i<=n;++i) ans=min(ans,dp[n&1][i]);
printf("%lld\n",ans);
return 0;
}
静渊以有谋,疏通而知事。