首页 > 其他分享 >题解:CF724E Goods transportation

题解:CF724E Goods transportation

时间:2024-10-03 10:44:45浏览次数:7  
标签:连边 CF724E transportation 断开 int 题解 xrightarrow 货物

可以在 cnblog 中阅读。

题意

有 \(n\) 座城市,第 \(i\) 座城市生产了 \(p_i\) 件货物,最多可以出售 \(s_i\) 件货物,编号小的城市可以向编号大的城市运输至多 \(c\) 件货物,问最多能出售多少货物。

\(n \le 10^4\)。

分析

乍一看是一个网络流问题,可以这样建图,令 \(S\) 为源点 \(T\) 为汇点:

\[S \xrightarrow{p_i} i \xrightarrow{s_i} T \]

\[i \xrightarrow{c} j (i < j) \]

然后跑一个最大流就可以。但这样建边第二类就会有 \(O(n^2)\) 条边,寄。

模拟费用流就是应对这样的情况的。我们把最大流问题转换为最小割问题,然后考虑使用 DP 求解。

令 \(f(i,j)\) 表示前 \(i\) 个点,\(j\) 个点与 \(S\) 的连边未断开,注意到 \((S,i)\) 与 \((i,T)\) 必断其一,则有转移:

\[f(i,j) = \min \begin{cases} f(i-1,j) + p_i + c \times j \\ f(i-1,j-1) + s_i \end{cases}\]

分别表示:

  1. 断开 \((S,i)\) 需要断开与前面所有未断开与 \(S\) 连边的点的连边;
  2. 断开 \((i,T)\)。

时间复杂度 \(O(n^2)\)。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

const int N=1e5+5;
int n,c;
int s[N],p[N];
int f[N];

signed main()
{
	IOS;
	cin>>n>>c;
	for(int i=1;i<=n;i++) cin>>p[i];
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++)
	{
		f[i]=f[i-1]+s[i];
		for(int j=i-1;j>=1;j--)
			f[j]=min(f[j]+c*j+p[i],f[j-1]+s[i]);
		f[0]+=p[i];
	}
	int ans=1e16;
	for(int i=0;i<=n;i++) ans=min(ans,f[i]);
	cout<<ans<<endl;
	return 0;
}

标签:连边,CF724E,transportation,断开,int,题解,xrightarrow,货物
From: https://www.cnblogs.com/tai-chi/p/18445458

相关文章

  • ABC221G Jumping Sequences 题解
    JumpingSequences把移动的上下左右改成左上、左下、右上、右下(坐标轴旋转\(45\)°)。则最终目的地是\((A+B,A-B)\)。(以前移动的方式是\((\pmd_i,0),(0,\pmd_i)\)。现在每次移动的方式是\((\pmd_i,\pmd_i)\))则\(x,y\)两维可以分开考虑。目标:从\(d_1\simd_n\)中选......
  • Codeforces Round 976 (Div. 2) 题解
    CodeforcesRound976(Div.2)题解2020B一个常见的想法:开关灯=异或,虽然在这道题里没啥用注意到,第i盏灯的按钮被按的次数就是i的除它本身以外的因子个数而完全平方数的因子数为奇数,其他数的因子数为偶数点击查看更多信息#include<bits/stdc++.h>usingnamespacestd;voi......
  • 题解:CF1976D Invertible Bracket Sequences
    可以在cnblog中阅读。题意给一个合法括号序列,问有多少区间\([l,r]\),使得将区间内的每个括号翻转后,括号序列仍合法。分析十分套路地,我们将(看成\(+1\),将)看成\(-1\),则一个括号序列合法的充要条件是转换后的序列满足:前缀和任意位置非负;最后一项为\(0\)。考虑翻转......
  • ZZJC新生训练赛第二场题解
    先给出比赛链接:https://ac.nowcoder.com/acm/contest/92036A小红打怪ShowCodeAclassPoint{//点类public:intx,y;Point(){}Point(intx,inty):x(x),y(y){}Pointoperator+(constPoint&P)const{returnPoint(x+P.x,y+P.y);......
  • 题解:TopCoder12316 ThreeColorability
    Vjudge可以出成《三色绘恋》背景。题意给一个格点数为\((n+1)\times(m+1)\)的网格,给格点染色,相邻的格点不能染成同样的颜色。每个格子有一条对角线的边,可选N形和Z形。现在有一个残缺的网格,存在一些格子的对角线连法不确定,构造一种字典序最小的方案使得至少存在一种染色......
  • 树上最值路径 题解
    题意简述给你一棵\(n\)个结点的树,编号为\(1\simn\),求有多少路径\(\operatorname{Path}(u\rightarrowv)\),满足\(u=\max\{x\midx\in\operatorname{Path}(u\rightarrowv)\}\),\(v=\min\{x\midx\in\operatorname{Path}(u\rightarrowv)\}\)。......
  • 题解:CF2014D Robert Hood and Mrs Hood
    差分,每次差分将\(\max(1,l-d+1)\)加\(1\),将\(r+1\)位置减\(1\)。然后前缀和求原数组,再遍历一下求最小值和最大值即可。代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt; cin>>t; while(t--){ intn,d,k; cin>>n>>d>>k;......
  • 题解:CF2009E Klee's SUPER DUPER LARGE Array!!!
    设\(m\)为\(a_1+\dots+a_i\),\(n\)为\(a_{i+1}+\dots+a_n\)。我们可以使用二分查找来搜索\(i\),使得\(m-n\)为最小的负数。如果我们移动到\(i+1\),则此时\(m-n\)为最小的整数。答案是两种情况下的最小绝对值。代码:#include<bits/stdc++.h>usingnamespacestd;pair<......
  • 题解:CF2009D Satyam and Counting
    比较容易观察的一道题,但是场上不开longlong见祖宗了。由于这题的\(x\)最大值比较小,所以我们可以直接存每个坐标是否有点。有两种三角形符号条件:存在两个点\((x,0),(x,1)\),可以观察到任意的其它点都可以成为第三点。有三个点为\((x,0),(x+1,1),(x+2,0)\)或\((x,1),(x+1......
  • 题解:CF2009C The Legend of Freya the Frog
    比较一眼的题目,场切了。分别考虑\(x\)和\(y\)。在\(x\)方向上我们需要的跳跃次数是\(\lceil\frac{x}{k}\rceil\),在\(y\)方向上我们需要的跳跃次数是\(\lceil\frac{y}{k}\rceil\)。考虑下面的两种情况:\(\lceil\frac{y}{k}\rceil\geq\lceil\frac{x}{k}\rceil......