图论杂题
CF1062F
好深刻的题。
重要结论:拓扑排序任意时刻,在 queue 中的结点互不可达。
证明显然。
然后考虑对原图拓扑排序一下,如果某时刻 queue 里面元素大于等于 \(3\) 了,就寄干净了。
有两个的话,考虑这两个 \(u,v\),那我想知道 \(v\) 所有可达的,\(u\) 是不是可达。那注意到某个 \(x\) 越靠近 \(v\),不被 \(u\) 可达的概率就越大。
所以枚举 \(v\) 的出边就可以。
queue 里面只有一个的话,某点被 \(u\) 可达当且仅当拓扑序比 \(u\) 靠后。
额类似地,queue 里面有两个,也可以这样求出来。
然后对反图再跑一遍,就可以求出某点寄没寄,以及如果没寄的话,她可达以及被可达的点的个数。算一下就可以求出没有可达关系的,就没了。时间复杂度 \(O(n+m)\)。
CF1558E
神仙题啊。但是好像没那么难?
首先就是,她不是哈密瓜,哈密瓜是 NPC 的,不要读错题了,不要读错题了,不要读错题了。
二分答案不用说。
然后考虑她每次扩展的形式。
感性理解一下,大概就是,我有一个点集,代表我击毙了怪兽,我可以进行很多轮扩展,每次扩展可以走一个?
- 环,或者链上套环,这样就可以原路返回。
- 连接击毙过的两个点的一条链。
- 链,但是一个端点不要求之前击毙过。这种扩展合法,当且仅当是最后一次扩展。
额然后显然,我某一次扩展如果能扩展出来一些点,那么是不劣的。
那扩展不了就寄了。
时间复杂度 \(O(n(n+m)\log V)\)。平方的来源是,我每轮暴力搜环。
爆标做法不会。
P9531
首先有一题叫做 P2619,然后有加强版叫做,对每一个 \(k=1,2,\dots, n\) 求出答案。和这个题很像。
那一题有一个做法就是,利用一些 MST 的性质,在分治的过程中,把一些边缩合起来,从而使得势能是对的。
那么类似地,这个题直接分治,设我当前处理 \(Que[mid]\) 的询问,因为他排好序了,然后我把 MST 上的边取出来,我记录一个 \(last\) 表示这条边最浅在递归树上,是哪个位置。
那由于一个性质,叫做每条边出现在询问的一段区间中,所以我可以这样搞。

出现这种情况时,在向右递归前,用并查集提前把这条边缩起来。回溯的时候再撤掉。然后可以用一个线段树处理一下这条边对之后询问的贡献。
势能的话,一条边出现的区间,大概被拆成了线段树状物,拆成了 \(O(\log q)\) 段。那算上排序、并查集、线段树,总复杂度大概是 \(O(n\log n+m\log q (\log m+\log n)+q\log m)\)。写的丑一点,动态开点,就变成值域老哥。

浙公网安备 33010602011771号