md,忍不了了,一拳把网络流打爆😡😅
Starry Night Camping
Solution
sb题,可以发现如果不合法一定是存在路径类似于 \((1,1)\to (1,0)\to (0,0)\to (0,1)\) (模 \(2\) 意义下的),那么我们直接每个点拆开,两个点之间连边为点权,然后不同层之间相邻的连边直接跑最小割就好了。
[CQOI2017]老C的方块
Solution
也很蠢,跟上面的差不多。按下图编号即可。
可以发现不合法路径一定可以表示为 \(1\to 2\to 3\to 4\) 的,所以跟上面一样拆点跑最小割即可。
CF1288F Red-Blue Graph
Solution
我们发现红点可以理解为红边-蓝边 \(\ge 1\),蓝点可以理解为蓝边-红边 \(\ge 1\)。那么我们把红边、蓝边都理解为流,假设红边为出边,蓝边为入边,那么红点即是入度-出度 \(\ge 1\),蓝点则相反。
那么我们可以用上下界有源汇费用流解决,建图如下:
(Linux下画图真的很麻烦就直接用一下湘妹的吧😨😅)
可以看出这样建图不会一条边即红又蓝。
CF802O April Fools' Problem (hard)
Solution
其实可以看出有一种暴力跑费用流的方法,即建二分图,然后左边往编号比它大的点连。
转成费用流之后就可以看出这玩意关于 \(k\) 实际上是一个凸包(这个比较显然),那么我们就可以用 wqs 二分。那么问题就是如何算最优方案。这玩意可以直接反悔贪心。所以就可以做到 \(\Theta(n\log^2 n)\)。
不过似乎有直接模拟费用流可以做到 \(\Theta(n\log n)\),但是感觉不如 wqs 二分好写。
【UNR #1】奇怪的线段树
Solution
挺有意思的。
可以看出我们真正关心的是是覆盖底部的节点,因为它们被覆盖,则祖先一定都能被覆盖。
然后我们可以发现的两个性质是:(右儿子是指是父亲的右儿子的节点,左儿子同理)
-
一个区间在线段树上会被拆成连续的右儿子和连续的左儿子。
-
任意右儿子左端点都不相同,左儿子同理。
那么我们其实相当于可以把一些节点串起来一起询问。具体来说,对于 \([l_i,r_i]\) 的右儿子,\(l_j=r_i+1\) 的节点 \(j\) 可以跟 \(i\) 拼在一起,对于 \([l_i,r_i]\) 的左儿子,\(l_j=r_i+1\) 的左儿子可以拼在一起。那么这个问题我们就可以用有源汇上下界最小流解决,即对于每个节点拆点,对于必须覆盖的节点两个点之间流量下界为 \(1\)。
但是这样显然第 \(1\) 类边会爆炸,第 \(2\) 类边是 \(\Theta(n)\) (根据性质 \(2\) 可以得出)。但是注意到我们完全可以对第 \(1\) 类边优化建图。所以就解决了。
复杂度据说是 \(\Theta(n^2)\) 的?不太会分析这种网络流建图的复杂度。不过似乎有贪心可以做到线性的。
[BJWC2018]Kakuro
Solution
虽然不是太难,但是这个shit题面让我直接看题解了(指读错题了)。
我们其实不难构造出一个合法解,即空位都填 \(1\),然后线索都填它所控制的空位个数。注意到一个重要限制是保证一个位置一定能同时被两个线索控制。那么我们可以考虑把线索拿出来按横纵分成二分图,然后对于一个线索而言,如果原来是 \(x\),现在是 \(y\),改变所需权值是 \(v\),如果 \(x\ge y\),那么有 \(y-x\) 是可以用 \(-v\) 去改回去的,然后我们还可以用 \(v\) 让它往 \(x\) 上面继续增加。
然后对于格点考虑,那么即是控制它的两个线索同时更改,那么我们可以把这个视作一条边,然后连边跟上面一样即可。
因为我们只是需要最小费用可行流,所以当 cost \(\ge 0\) 的时候退出即可。
不过这样建边似乎不能处理不能更改权值的点,其实可以发现把权值设为 \(\infty\) 即可,这样它更改一定不优,最后判一下无解即可。