2024.5 做题记录
2024.5 做题记录
[Violet] 天使玩偶
显然发现我们需要在时间轴上进行 cdq 分治,然后统计答案。
问题在于这个绝对值不好维护,需要进行转化。如果我们钦定这个点最近的点在它的左下方,那么绝对值就可以化为
但是显然我们最后的答案不一定在左下方,还可能在其他四个方向。那么我们每次做完 cdq 就把整个坐标系旋转
[CTSC2018] 混合果汁
首先发现题目中有最小值最大的含义,可以想到二分。我们二分这个最小值,那么接下来我们就考虑买
对于第一种情况我们增加最小值,否则减少最小值。但是这样做 check
的复杂度似乎较高。
考虑到朴素的二分时间主要花费在 check
上,那我们考虑缩小 check
的时间。首先对于第三种情况,我们可以十分简单的利用前缀和求解。同时,第二种情况的另一种表述就是 “达到体积要求的钱数大于当前钱数”,那么我们只需要再维护 “达到体积要求的最小钱数” 即可。
考虑使用线段树,以
现在时间复杂度就是
这时候就可以考虑整体二分,把查询放一块处理,时间复杂度就变成
[SCOI2007] 蜥蜴
首先我们肯定想到是从一个柱子向另一个能跳的柱子连边,但是这样下来是错误的。
我们考虑到这张图的权值在点上,因此考虑拆点,将每一个点拆成入点和出点,这两个点之间的容量就是柱子高度。而对于两个点之间,将第一个点的出点与第二个点的入点连边,容量为
接下来我们考虑源点和汇点。首先源点应该是每个蟋蟀在的柱子,但是这样会有多个源点,因此建立超级源点;同理,所有边框外的部分都是汇点,因此建立超级汇点。
由于每个柱子上只能放一只蟋蟀,因此超级源点到每个汇点的容量是
最后我们直接跑最大流即可,答案需要用总蟋蟀数减去最大流流量。
士兵占领
首先看到方格问题,直接考虑连
接下来我们发现题目要求的是最小值,由于我们只会最大流,因此这个最小值显然是做不了的。考虑转化,即求出空出的格子数量的最大值,这样我们就可以使用最大流了。
那么既然这样我们就要求出每一行每一列空出的格子数
那么既然这样我们上面提到的
Upd:显然用上下界网络流也可以简单来做,使用有源汇上下界最小费用可行流即可。
[HNOI2007] 紧急疏散
这个题你的建图很容易假掉,然后这个题的数据还特别水,所以你的假做法大概能拿
首先这道题是求出所有人撤离的最短时间,显然可以想到二分答案。我们假设当前要检查
既然这样,我们就可以采用按照时间拆点的方式来做。我们将每一个门拆成第
首先建立超级源点,给所有空地连容量
然后我们计算出每一个空地到每一扇门的距离(可以从门开始用 BFS 求解),对于每一块空地,向任意一扇门的对应所用时间连边,容量为
最后建立超级汇点,每一扇门向汇点连容量
但是这样会有一个问题,尽管一扇门每次最多进一个人,但是先来的人可以等,然后再进门。也就是说门的时间也应该是变化的。因此将每一扇门的每个时刻向下一个时刻连边,容量为
然后我们直接跑最大流就可以求出有多少人逃离了。
[SCOI2012] 奇怪的游戏
首先看到这个时间就知道肯定是二分答案。
由于这是棋盘问题且格子之间有影响,考虑黑白染色。假设黑色格子总数为
由于黑白格子总是同时染色,因此操作总次数应当相等,所以可以得到上式。接下来变形为:
那么此时我们分类讨论一下。
当
显然此时我们无法直接求出 check
函数。
由于黑白染色,所以先考虑从黑格向白格连边,容量为
然后我们跑最大流,如果流量等于
最后一定注意
当
显然可以直接求出 check
函数检查一下即可。
[国家集训队] 人员雇佣
这道题唯一的教训:网络流建图不要 YY,要有正确性。
我们首先将答案设置为
首先我们可以很容易的想到如下的东西:建立超级源点和超级汇点,从超级源点向每个点连容量
那么这样我们就可以将超级源点看做对面公司,超级汇点看做我们公司。接下来考虑如何连剩下的边。
我们发现上面连的
换句话说,如果一个点走了,它本身的贡献会从
那么这样我们就可以直接求最小割了。
为什么不能使用类似 [国家集训队] happiness 的思路呢?
很简单:那道题目中走掉一个人或两个人对于答案的影响一致;而对于这道题,走一个人或两个人对于答案的影响是不同的。
[BZOJ3158] 千钧一发
首先让我们仔细观察题目中的性质,然后不难发现这样两条性质:
- 对于两个偶数,一定满足条件
。 - 对于两个奇数,一定满足条件
。
第二条的证明如下:
显然一个完全平方数
,一定有 。其中当 为偶数时余数为 ,否则余数为 。 现在考虑两个奇数
,首先一定有 ,那么相加得 。而上面我们已经说明一个平方数模 只能余 ,因此命题得证。
于是我们将
现在我们发现,要去掉的就是一个最小割,因此我们直接求最小割然后用
[HNOI2013] 切糕
其实由这道题延伸出来了一种网络流模型,名字就叫切糕模型。具体内容如下:
题意:给出
个变量 ,其中每个变量的取值范围是 。对于一个变量 ,取 的代价为 。同时,给出若干限制条件 ,表示 (或 )。 请求出一种合法的赋值方案,使得代价总和最小。
首先我们考虑拆点,将每一个变量拆成
现在我们考虑连边,首先要建出
这样我们断掉
我们以
上面这一部分就是切糕模型的基本思路,现在回到这道题,我们发现不同的地方只在于限制条件变为了
Other Saying:
在 [RC-02] 开门大吉 中,这样普通的建图方式无法通过。考虑下图的情况:
![]()
显然此时没有正确解法,但是我们真的去跑最小割会发现我们割掉了
然后求出了一个错误的答案。 出现这种现象的原因很简单,我们每个链上割了不止一条边,这样肯定就不符合上面所说的了。
解决方法也很简单:我们对于每一条边再连一条
的容量为 的边。这样如果在一条边上有两条割边,我们依然能从 走到 ,这样显然就不对了。 但是本题没有这个限制。
[AHOI2009] 最小割
这道题就是让我们求一条边时最小割的可行性和必要性。
首先让我们先证明一个东西:最小割上的边在最大流上一定满流。
首先回到我们的最后一次增广,此时
还是有路径的。而当最后一条增广路被增广后, 就不再联通。因此,这条增广路上的所有满流的边就可能会是最小割上的边。由于增广顺序不定,因此所有满流的边才有可能是最大流。
然后接下来我们再探究可行性和必要性的条件。
首先先看可行性,一个条件当然是上面提到的满流。另一方面,我们考虑一条边
于是,我们就可以得到一条边在最小割中可行的充要条件:
- 满流
- 在残量网络中
无法到达 。
接下来我们来看必要性。首先还是满流。其次我们考虑必要性的实质,也就是如果这条边不断,别的边就算全断也没法将图割开。因此这条边就是
因此,一条边在最小割中必要的充要条件为:
- 满流
可以到达 且 可以到达 。
Tips:容易发现必要性的第二条一定满足可行性的第二条。
那么接下来我们考虑如何求解,首先第一个条件都是好求的,直接跑最小割看剩余容量。然后是判断联通。这里我们考虑使用强连通分量,直接判断两个点是否在同一强连通分量内就可以判断是否有路径可达。因此 Dinic 完再跑一遍 Tarjan 即可。
[SDOI2016] 数字配对
看到价值前提下最多的配对数,想到最大费用最大流。
我们首先对于每一个
那么此时我们就考虑将
但是我们其实可以发现,这道题目并不是一个标准的最大费用最大流。它是在满足费用不小于
最后输出最大流量即可。
[SCOI2007] 修车
首先我们发现,对于一个技术人员
我们发现这个式子似乎是可以连边的,但是实际上由于
但是此时我们如果使用一下逆向思维,会发现对于倒数第
那么现在我们直接连边,首先将师傅拆成
那么费用限制其实就考虑完了,接下来看流量限制。首先从超源向每一辆车连容量为
接下来我们跑最小费用最大流,求出的最小费用就是总的等待时间,然后除以
[NOI2012] 美食节
这道题是上一道题的加强版,因此建图思路是一致的。只列举不同的地方:
- 超源向每一道菜连的边的容量是
。 - 每个师傅要拆成
个点。
这样我们直接提交,发现拿到了
考虑上面的思路不优在哪里,我们知道,对于一个师傅
也就是说,只有前面的菜都放满了,这个位置才有考虑的必要,在此之前都是没有必要的。既然这样我们是否可以考虑在之前不考虑这个点呢?
考虑动态加点的思想,每次 EK 都能找出一条增广路并增广,意味着这个位置可能会被占据;而当这个位置是当前这个厨师的最后一个位置时,我们就加上新的位置,然后对应连边。
在初始的时候我们都只给师傅的倒数第
[六省联考 2017] 寿司餐厅
首先这个题面长到爆炸,我们总结一下关键点:
- 一次必须取一段。
- 每一段下的所有子区间的
要累加。 - 重复的
只算一次。 - 收费为
。
那么我们来关注第三四条,假如我们选了两个有重叠的区间,那么收的费用会多出一个
接下来考虑剩下的部分。由第二条可知,对于区间
接下来考虑收费,我们先看多吃一个
我们总结一下上面的建图:
- 让
指向 和 ,同时 对应的点权为 。 - 叶子结点
的点权为 。 - 对于每一个叶子结点
,让它指向点权为 的新建节点。
这样,我们在选的时候,必须要满足选了这个点就必须选它指向的点。而我们的目标是要让所有的点权加起来最大。不难发现现在的条件完全就是一个最大权闭合子图的模板,直接套上去即可。
[SDOI2010] 星际竞速
这道题有两种思路,一种很好想,另一种不太好想。
先说好想的思路。
首先我们看到题目中有关于必须走一次这样的限制,不难想到上下界网络流。对于每一个点
考虑连剩下的边。根据题意,我们需要将所有通道的边连上,同时每一个点还可以通过爆发到达任意一个其他点,因此还要将这些边连上。此时我们容易发现,边数已经来到了
我们会发现这样一件事,如果我们在比赛途中使用爆发,由于爆发到
这样做边的数量就差不多是
最后我们直接跑一个有源汇上下界最小费用可行流即可。
Tips:容易发现,经过这一步简单的转化,本质上这道题与 [bzoj2055] 80人环游世界 没有任何差别。
接下来是不太好想的思路,我们可以不需要上下界,直接使用最小费用最大流。
首先还是得先拆点,让
最后考虑
这种操作就不是很寻常,当然其中有一些思想是第一种方法也用到的。
[清华集训 2017] 无限之环
有一点码农题的味道。
首先我们发现这道题根本看不出来是一道网络流。考虑数据范围,只有 牵强自然的想到网络流。
首先不考虑旋转,先看怎样连边。容易发现这个网格中行列没有限制而每个格子有限制,自然想到黑白染色,从白格向黑格连边。接下来继续考虑接口的限制,自然没有旋转的时候可以直接连边,但是有旋转显然不行。
考虑到旋转之后状态会改变,于是可以想到将一个点拆成能够旋转成的所有状态,然后连上对应次数作为费用。听上去很可行但实则不然,因为这样我们的流量表示的就是这个水管流出的接口数,这样与我们要求的操作次数八竿子打不着,因此这样是错误的。
那么我们这样考虑:将一个点拆成上中下左右五个点,其中这中间的点来代表这个点,与源汇点相连。剩下四个点,表示这个方格周围的四个接口。那么我们此时从白格向黑格连边,就可以直接将对应方位的接口连起来即可。
接下来我们以白格(连源点的格子)为例考虑。首先初始的时候这个格子有哪些接口相同,就将中间的点向对应的接口相连,流量
首先看最简单的,只有一个接口的那个水管。
假如我们本来是向上的,那么应该是中点向上点连边。这代表向上的接口有
思考一下上面的那一段话,然后我们会连出这样一条边:从上点向右点连边,流量
于是我们就得到了这道题旋转的真正思路:用原来的边表示流量,新加的边来表示旋转后流量的转移。
根据这个理论,我们就可以轻松搞出剩下格子中的边。
接下来考虑 L 型水管。
假如水管是正 L,那么初始的时候应该是中点向上点和右点连边。如果顺时针旋转一次,那么相当于上点的流量转移到了下点,于是从上点向下点连边。同理从右点向左点连边。
此时会发现我们似乎并没有考虑转两次的情况,但仔细思考就会发现,如果上点右点的流量都转移,那么费用是
最后看 T 型水管。
此时初始的时候应该是中点向左点下点和右点连边。那么旋转一次后左点或右点的流量会转移到上点,而旋转两次后下点的流量会转移到上点。那么我们直接连边即可。
最最后 X 型水管根本不用管,直接连好所有边即可。I 型水管也不用管,因为题目不让管。
那么对于黑格,只需要将上面的边全部反过来,朝向汇点方向即可。
最后我们从源点出发,跑一遍最小费用最大流。如果最大流流量
其实不能动直线型水管的原因很简单了:在这样的建图方式下,转一次直线型水管意味着两个接口的流量都要转移,而网络流是没有办法实现让它必须同时转移的,因此不动直线型水管其实是标答的漏洞吧。
[NOI2010] 海拔
首先我们观察题目,不难注意到以下几点:
- 点的高度是任意的实数,且需要互不相同。
- 起点高度为
,终点高度为 。
这样来看这道题似乎不简单,尤其这些条件看上去很唬人。但是我们显然可以简化他们。下面通过三个引理来说明。
引理
:最优情况一定是所有高度在取到 时。 证明:显然可得,如果一个点高度
或 ,那么将他改为 或 ,对于从他出发的边不会更差,而到达他的边走的高度会更优。
引理
:一定会有一种最优方案在所有高度取到 或 的时候。 证明:考虑任意一条从
到 的路径,显然高度都必须上升 。那根据上面引理 的结论,显然所有点要取在 之间,于是我们得到只有在这条路上所有点高度严格不降时才会更优。那么我们设高度升高的边的边权分别为 ,高度分别上升 。此时代价显然是 。考虑 中最小的一个 ,如果我们只让 ,那么此时的代价就是 。那么我们一定会有: 于是就可以得到,对于一条路径,只要选取边权最小的一条边
,让 即可达到最小。剩余的分别取 或 即可。照此推广到全局同样如此,不断按照最优策略换成 或 ,答案一定不会更差,也就是一定会有一组最优方案满足所有点高度都为 或 。 当然我们会细心的发现题目中要求高度互不一致,而此时我们却说所有点高度都是
,似乎有失偏颇。其实这个问题同样简单,发现题目的输出只需要保留到整数,所以我们给每一个点权减去或加上互不相同的极小的一个量 ,这样就能满足互不相同的条件,而答案是不变的。
引理
:在 引理 的基础上,该最优方案一定满足高度为 的点与高度为 的点构成联通块,且分别包含 。 证明:以高度为
的点举例。假如 周围高度为 的联通块中有高度为 的联通块,那么将这些高度为 的点都变成 显然会更优。高度为 同理。所以高度 的点和高度 的点一定都联通。
根据引理
这不就十分显然了吗,直接跑最小割即可。但是我们发现会 T 一个点。
考虑到这个网格图一定是平面图,这就想到了平面图最小割转对偶图最短路。按照传统功夫做出对偶图的
[NOI2008] 志愿者招募
据我所知这道题至少有三种解法。下面按照思考难度从易到难讲解。
Solution 1:
考虑到题目中有 “至少需要
接下来我们考虑对于每一类志愿者建立一个点
此时我们显然是要求最小费用,那么直接跑无源汇上下界最小费用可行流即可。同时容易发现其实
其实做了这么多题不难发现,上下界网络流的思路往往最为直观好想,当然代价就是跑的比较慢。
Solution 2:
容易发现,题目的所有要求可以概括为:
设
不难发现,上面这个问题就是一个显然的线性规划问题。那我们就可以直接按套路走。首先将不等式化为等式:
现在对相邻式子做差得:
此时我们不难发现,当
那么接下来我们就可以直接开始建图,直接套用模板即可:
- 建立
个点代表等式,以及源点 汇点 。 - 对于
,若 ,连边 ;否则连 。 - 对于所有变量
,显然在第 个等式中为正,第 个等式中为负。那么连 。 - 对于所有变量
,显然在第 个等式中为正,第 个等式中为负。那么连 。
最后跑最小费用最大流即可。
Solution 3:
我们直接从题目的实际含义下手。
首先我们考虑对于每一天建立一个点。然后同时还要源点
先考虑表示出每个志愿者管辖的区间范围。我们希望让他转化为覆盖边,因为这样我们才能转化为流量上单的问题,所以我们考虑连边
然后接下来考虑人数限制。我们不妨从简单情况入手,考虑只有一个志愿者,区间为
这样我们通过流量守恒就可以让志愿者与人数限制匹配,当然网络流流量不能是负的,我们可以给他们全部加上
最后总结建图如下:
- 建立源点
,汇点 。连边 。 - 连边
。 - 连边
。
这样我们直接求出最小费用最大流即可。
最后尝试发现,三种解法所用时间也是依次递减的。
[SDOI2017] 新生舞会
其实这道题的难点就在于我不会 01 分数规划,会了这个东西之后这道题就异常简单了。
首先我们会想到 dp,但是显然的问题是这个 dp 是有后效性的,也就是说会存在
接下来就不难发现题目的
这个时候我们会发现,将男生看作一部点,女生看作另一部点,就构成了一个二分图。如果我们此时将男生
- 建立源点
,设 为男生,连边 。 - 建立汇点
,设 为女生,连边 。 - 设
为男生, 为女生,连边 。
跑出最大费用最大流,最大费用就是
最后直接输出二分的答案即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现