补不完。太多了。
CF1783F Double Sort II
先对排列建 \(a_i\to i\)。
交换 \(i\) 与 \(a_i\) 会使 \(a_i\) 原来所在环大小减 1,证明画图理解。最后需要变为 \(n\) 个自环。
把每个环集合抠出来,相当于每个环集合 \(S\) 中至少需要操作 \(|S|-1\) 个数。两个排列同理。
我们发现操作一些数会使两个排列中的环大小都减少,有些数只会影响一个排列,有些数不会影响。zrdz说过正难则反,考虑最大化最后一类数的个数,即选一些数使得任意两个不出现在同一个环中,或每个环的集合内至多选一个(两个排列都是),使选的数个数尽量多。
有点抽象
考虑网络流建模,原点连向 \(a\) 中的环,环连向环中点,点连向 \(b\) 中环, \(b\) 中环连向汇点。容量都是 1。流过一个数表示选它。这样就满足了每个环的集合内至多选一个且选了对两个排列均生效。
此时最大流即为最多的选的数的个数。答案即为 \(n-\) 最大流。
CF1773D Dominoes
先黑白染色建二分图,题目保证这时两边点数相等。设两边点数均为 \(k\)。
首先标记同一边的两个格子必然满足条件,方案数有 \(2\dfrac{k(k-1)}{2}=k(k-1)\),那么但凡 \(k(k-1)\ge 10^6\) 就不用做了。接下来考虑 \(k(k-1)<10^6\),差不多 \(k\le 10^3\)。
考虑左右各标记一个格子的情况,枚举左边格子并构造没有这个格子的新图,计算右边那些格子是二分图上的必经点(即任意最大匹配都经过的点),这些点就是标记掉以后满足条件的点。
关于最大匹配非必经点这个东西有一个结论:
先做一遍最大匹配,找出一种方案。
- 从左边每一个非匹配点出发,遍历它的右部邻居。如果一个邻居 \(u\) 是匹配点,那么找出 \(u\) 对应匹配的左部点 \(v\) 并遍历它的右部邻居,重复该流程。所有遍历到的左部点都是非必经点。
原因还是比较好理解的。左部非匹配点一定是非必经点;每个遍历到的左部匹配点都存在以其为起点的一条增广路使得终点是一个左部非匹配点。翻转这条路上所有边的状态(匹配 $\to $ 不匹配,不匹配 \(\to\) 匹配)可得一个新的合法最大匹配,因此这条路径上所有左部点都是非必经点。
右部点同理。
一个方便一点的做法是跑一遍网络流,从 \(S\) 走 \(1\) 边遍历到的所有左部点即为非必经点, \(T\) 开始 \(0\) 边遍历到的所有右部点为非必经点。
必经点就是点数减非必经点。
CF1717F Madoka and The First Session
首先假设操作都是 \(u\to v\) 并模拟出最终结果。因为每反转一条边会使两个点权值减 2 / 加 2,不影响奇偶性,所以一旦奇偶性不同就寄。
然后我们的到了每个 \(s_i=1\) 的位置还需要加上的数 \(add_i\)。显然 \(add_i\equiv 0 \pmod 2\)。给每个 \(add_i\) 都除以 2。
这时以数为流量,看做网络流模型,操作一条边 \((v,u)\)(反向) 就是给 \(v\) 的权值减 1, \(u\) 的权值加 1。最后所有 \(s_i=1\) 的点均有一个流量限制 \(flow=add_i\),用上下界逃课。
有负数好处理,统一加上一个比较大的数 (比如 \(10^6\))就行了。
标签:二分,必经,遍历,匹配,格子,网络,add,左部点 From: https://www.cnblogs.com/jimmywang/p/17564232.html