奇怪的图题
CF920E Connected Components?
妙妙题。
自己的做法很怪,大概是把大小 \(\le50\) 的连通块找出来扔掉,然后剩下的点钟如果有 \(\ge 2\) 个连通块,边数会是 \(50(n-50)\le m\),推出 \(n\le \dfrac{m}{50}\),差不多是 \(4\times 10^3\),可以平方暴力。
题解做法好像很厉害:抽屉原理得一定有一个点删掉的边数 \(\le\dfrac{m}{n}\),找出这个点并把它周围在原图中连接的点接起来,形成一个大小为 \(n-\dfrac{m}{n}\) 的连通块。剩下 \(\dfrac{m}{n}\) 个点,每个暴力枚举连出的 \(n\) 条边,并查集维护,总复杂度 \(O(\dfrac{m}{n}\times n)=O(m)\)。
CF1508C Complete the MST
上面的衍生版本。设给出的边权异或和为 \(s\)。
分类讨论:
- 没有给出的边数 \(\ge n\)
此时没有给出的边组成的图(补图)必然成环,那么补图中一定有一条边不会出现在 MST 中。
那么我们可以设补图上所有边权都是 \(0\)。由于一定会有不出现在 MST 中的边,可以把这条边的边权设为 \(s\)。
显然我们并不需要知道这条边是哪条。
于是用上面那题的方法找出补图的所有连通块,再把输入的边加进去。
- 没有给出的边数 \(\le n\)
有 \(\dfrac{n(n-1)}{2}-m\le n\),解出来差不多 \(n\le 633\)。
若这些边没有全部出现在 MST 里,我们可以枚举哪条边不在并设其边权为 \(s\),其他边权为 \(0\),然后直接做 MST,\(O(n^3)\)。
若这些边全部出现在 MST 里,那么这些边的边权和需要最小,那还是一条边 \(s\) 其他边 \(0\)。和上一种情况重合。
于是做完了。
[ARC150C] Path and Subsequence
记 \(dis_u\) 为 \(1\) 到 \(u\) 的所有路径中与 \(b\) 的最小匹配度(最小的最大匹配位置)。
那么 \(u\to v\) 的转移就是看 \(v\) 的颜色是否等于 \(b[dis_u+1]\),相等的话就可以 +1。直接跑 dij 就行。
最后判断 \(dis_n\) 是否等于 \(b\) 的长度。
CF1749E Cactus Wall
题目条件等价第一列到第 \(m\) 列的斜联通路,每个点有 \(4\) 个方向可以转移,边权 \(0\) 或者 \(1\),直接 \(01\text{bfs}\) 解决。
CF1693C Keshi in Search of AmShZ
最短路优化 \(dp\)?
设 \(dp[u]\) 为从 \(u\) 到 \(n\) 的最少天数。\(dp[n]=0\)。
因为是随机走到一个点,可以看成最坏情况,永远往能走的点中 \(dp\) 值最大的点走。
若给每个点定一个 \(nxt_u\) 表示将要选择走的点,那么堵的人就得把终点 \(dp\) 值大于 \(dp[nxt_u]\) 的边全部堵掉。反过来说就是 \(u\) 的出度减去终点 \(dp\) 值小于等于 \(dp[nxt_u]\) 的边数。
这看着就很像一个松弛操作,只不过我们需要边求 \(dp\) 边求边权。
将 \(dp\) 视为距离,从 \(n\) 开始建反图跑 dij。由于 dij 的特性,在松弛边 \(v\to u\)(原图上是 \(u\to v\))时,假设 \(nxt_u=v\)。对 \(u\) 来说 \(v\) 出现的顺序一定按 \(dp[v]\) 从小到大出现。
那我们记录一个 \(del[u]\) 表示 \(u\) 已经有多少条边被经过过,那么还需要堵的边数就是 \(deg[u]-del[u]\),再加 1(走过去的 1 天)就是边权。直接跑即可。
CF1824D Tenzing and His Animal Friends
把限制当成图上无向边,感性理解一下,每个点在最终方案里最多出现 \(dis_u\)(\(u\) 到 \(n\) 的最短路)次。
构造方式不难:先设一开始的字符串是 \(1111....111\),然后将点按照 \(dis\) 排序,每遇到一个点就把它删除(1->0),上一个字符串存在的时间就是这个点的 \(dis\) 减去上一个点的 \(dis\)。
证明简单:对任意一个限制 \((u,v,w)\),有 \(|dis_u-dis_v|\le w\),而 \(u\) 和 \(v\) 只有一个存在的时间是 \(|dis_u-dis_v|\),必然满足条件。
P5471 [NOI2019] 弹跳
图的部分其实不多。。主要在优化建图。
大战 \(\text{KDTree}\) 一晚上学会了阉割版的 \(\text{KDTree}\),解决这题够用了。
直接对城市建 \(\text{KDTree}\),弹跳器就是矩形查询加边。看似非常版,然后你 \(\text{MLE}\) 了。
使用一个隐式建图的小技巧:不要真的把边建出来而是在需要用的时候根据原本建边的逻辑遍历每一条边。在这题的表现就是 dij 做到 \(u\) 的时候再查所有从 \(u\) 出发的矩形。
还有一个卡常小技巧:由于 \(\text{KDTree}\) 上一个节点(效果上相当于)会向它的子树所有的点连 \(0\) 边,所以它的 \(dis\) 应该永远不小于 子树内节点的 \(dis\)。
所以如果当前节点都松弛失败(尝试松弛,就是判断大小,并不真的松弛),那么就不用继续递归了,毕竟子树内的点一定有更优的选择。

浙公网安备 33010602011771号