0%

做题3

CF1698F

思路

变过来变过去,还 TM 离谱的操作当然要找不变量,算是半个套路。

reverse 两端相等的区间,可以发现每两个相邻元素构成的无序对不变,然后第一个元素和最后一个元素不改变。

换句话说,$\{(a_i,a_{i+1},i \in [1,n)\}$ 这个集合不随 $a$ 中操作改变。或者说,如果从 $a_i$ 到 $a_{i+1}$ 连边,这张无向图是不变的,同时 $a_1,a_n$ 不改变。这个条件和上个条件之间的转换是解题的关键点之一。

套路又来了,看看样例,集合相同并且首尾相同这个条件貌似挺充分的,所以考虑证明。

对于构造问题,常用的证明方式是数学归纳法。

事实上,如果我们能证明如果第二个数可以成功调整为相同,那么整个数组也可以,因为满足条件的 $a,b$ 如果同时删掉第一个数,仍满足条件。

考虑构造方案,由结论可以知道,如果 $a$ 中必定存在 $(b_1,b_2)$ 无序对,因为 $a_2\neq b_2$,不妨让这对无序对是 $(a_x,a_{x+1}),x\in[2,n)$,如果 $a_x=b_2$,考虑直接将这一对中的 $a_{x+1}$ 和 $a_1$ 子数组 reverse ,完事。如果 $a_{x+1}=b_2$,事情有点麻烦。

if only i could find a pair which...

补上那句话,如果能找到一对可以被翻转的,左端点在 $[1,x]$ ,右端点在 $(x,n]$ 的,那么我们就翻转,改变了 $a_x,a_{x+1}$ 的顺序。

尝试证明一定能找到,即 $\{a_i ,i\in [1,x]\} \bigcap \{a_i.i\in(x,n]\} \neq \emptyset$

反证法,如果找不到,那么可知 $a_i,i\in[1,x] $ 与 $a_j,j\in (x,n]$ 除开 $(a_i,a_i+1)$ 这一次相邻外均不相邻,考虑 $b_2$ 即 $a_{x+1}$ 的情况,它与 $b_3$ 相邻,可知 $b_3 \in \{a_i.i\in(x,n]\}$,同理有 $\forall j\ge 2,b_j\in\{a_i.i\in(x,n]\}$

考虑 $a_2$,它显然不存在于 $b$,故矛盾。

回顾

这题比较难的有两个点,一是注意到这个不变量极大可能是充分条件,二是发现 $a_{x+1}=b_2$ 的 case 中一定存在可交换项,搞定了这两个,问题就迎刃而解。关键点在于第二个,找到 $a_{[1,x]},a_{[x+1,n]}$ 交集的关系,并尝试用反证法证明交集不为空是比较困难的。

ABC259G

很有意思的网络流题。

最开始想到二分图相关,因为 $A_{i,j} <0$ 的限制指向性比较明确,然后发现如果二分图的决策正数话会出现不同块之间相互影响,所以考虑决策负数,决策负数不同联通块互不影响,但是无法计算答案,因为最终还是需要确定到底哪些正数被选了。

解法一

题解给出了一个新思路,考虑先只把所有正数选了,然后再来看满足条件的代价。

代价被分为了三类,第一类是顺带选择的负数的代价,如果选了一行或者一列,就会有这一行或列所有负数绝对值之和的代价。

第二类是无法选择正数的代价,如果正数所在的行和列都没被选择,那么就会有这个正数的代价。

第三类是重复选择负数的代价,如果一个负数被行和列同时选择(为了付出更少的第二类和其它第一类代价),那么这个代价是无穷大。

我们需要最小化代价。

0/1 决策问题,考虑套最小割上去,每一行每一列视为一个点。

令与 $s$ 同集合的为选择,与 $t$ 同集合的为不选,选一行或一列的代价为该行或列负数绝对值之和,从个点到 $t$ 连边就行,行列同时选择负数,代价为 inf,woc,怎么连呢?从行连向列,意义为选了行不选列的代价,从列向行连,意义为选了列不选行的代价。所以我们前面的安排有些问题,需要做出调整。

对于行和列,我们让属于 s,t 所在集合对它们有不同意义,下面让属于 s 的行为不选择,属于 t 的列为不选择,我们让 $s$ 向行连边,这条边表示选该行的代价,让列向 $t$ 连边,表示选该列的代价。于是,对于一个点,行列都选的代价当且仅当 $A_{i,j}<0$ 时为 inf,此时从列向行连边,表示都选的代价,行列都不选的代价当且仅当 $A_{i,j}\ge0$ 时为 $A_{i,j}$,此时从行向列连边。

注意,我们的割中如果出现了行列都不选,那么对应的行和列与 $s,t$ 的边一定没有断开,所以必须断开行到列的边。如果出现了行和列都选的不合法情况,我们发现,断掉的行能到 $t$,从 $s$ 一定能到断掉的列。如果不满足,那么这个割就不是最小割,不会被我们考虑。所以我们需要从列到行连边,保证不会给负数打上两个标记。

这种思路和某类 dp 的思路很类似,相当值得学习,其实在原问题的求解中,并没有什么条件来保证不会给一个负数打上两个标记,但是我们在通过最小割求解时,限定了决策的范围和最优性,获得了额外的信息,也就能帮助我们排除掉难处理但是不可能的情况,本质上,这种排除还和我们先假定所有正数都选上的前提有关系,这种解法相当精妙。

解法二

从直觉上来看,应该不会选择和为负数的行或者列。考虑一个最终方案,它的答案会是 $\sum 选择的行+\sum 选择的列 -\sum 行列交叉处的正数$。考虑从这里面剔除和为负数的列或行,发现最终值一定变大。

所以删掉和为负数的行和列。

考虑先把剩下的行和列全选了,然后解决冲突。

解决冲突的方式有三种,一种时不选行,一种是不选列,另一种是硬吃同时选的代价。

这样的建图就很简洁了,从 $s$ 向行,列向 $t$ 连边,对于交点,正数连其值的边,负数连 inf 边。很容易发现一个合法解和一个割一一对应,over。

Sum up

最小割解决实际问题的核心,在于用一个割,或者可能成为最小割的割,来代表一个实际的决策方案,最小割的容量,代表代价,每个点在哪个割集分别代表什么含义并不重要,重要的是割掉每条边的意义,和决策方案与最小割的对应关系。

其实这道题还给我们一个启发,就是在考虑0/1决策问题时,可以先考虑钦定一个决策,再来调整使得它合理或者变优,这可能会使得问题变得简单,也许算是一个套路。

本质上,最小割表达了一种最优的解决决策冲突的方案,我们在 0/1 决策问题钦定决策的过程中,制造了一些冲突,用一个图的割来表达解决着些冲突的方案。