CF1268

Codeforces Round #609 (Div. 1)

A

\(b\)\(a\) 的前 \(k\) 位后循环得到的数已经 \(\geqslant a\) 了,则其为最优解,否则答案在第 \(k\) 位加 \(1\) 后再循环得到的数。需要注意处理进位。

B

放骨牌为二分图匹配,得答案为黑白染色后黑格子个数和白格子个数取 \(\min\)

C

考虑先将 \(1 \sim k\) 的数合并到一起,即相互相邻,然后再进行调整,第二步调整的花费即为逆序对数。肯定是所有数合并到中位数的位置是最优的。用树状数组维护每个数的出现位置,在树状数组上二分可求解中位数。

D

\(n \geqslant 4\) 时,\(n\) 阶强连通竞赛图存在 \(n-1\) 阶强连通子图,因此翻转不在强连通子图的那个点,能使其仍为强连通图。

根据这条引理,可以推得:当 \(n>6\) 时,可以翻转至多 \(1\) 个点使原图变成强连通图。

考虑证明:

若图中只有两个 \(SCC\),因为 \(n>6\),则一定有一个 \(SCC\) 点数 \(\geqslant 4\),翻转其内一点,使该 \(SCC\) 仍强连通,然后会形成一个大环,因此图就为强连通图了。

若图中至少有三个 \(SCC\),选取拓扑序既不是最小也不是最大的一个 \(SCC\),翻转其内一点,设拓扑序最小的 \(SCC\)\(a\),最大的为 \(b\),翻转的那个点为 \(z\),对于任何点对 \(x,y\),都存在路径 \(x \to b \to z \to a \to y\),因此图就为强连通图了。

得做法为:\(n \leqslant 6\) 时枚举翻转点的集合,\(n>6\) 时枚举翻转哪个点。

还需快速判断一个竞赛图是否为强连通图。发现竞赛图缩点后,拓扑序最大的 \(SCC\) 中每个点都比该 \(SCC\) 外的任意一点出度小,设该 \(SCC\) 内点数为 \(k\),得其出度之和为 \(\binom{k}{2}\),有结论:

一个竞赛图非强连通的充要条件为其点按出度从小到大排序后,存在 \(k<n\) 使得最小的 \(k\) 个点出度之和为 \(\binom{k}{2}\)

根据这个结论就能快速判断竞赛图是否为强连通图了。

E

先考虑树的做法,设 \(f_x\) 为点 \(x\) 的答案,按边权从大到小加入边,用 \(f_x+f_y\) 更新 \(f_x\)\(f_y\)。但是在仙人掌上沿用树的做法会算重,需要减去算重的部分。设 \(\min\) 为环上边权最小的边,\(\max\) 为在同一个环上边权最大的边,当 \(\min\)\(\max\) 的两条路径上的边权都递增时,\(\max\) 的两个端点会在 \(\min\) 的两个端点处算重,减去即可。

posted @ 2020-10-13 20:10  lhm_liu  阅读(195)  评论(0编辑  收藏  举报