省选图论专题 1 做题记录
省选图论专题 1 做题记录
A [CF1264F] Beautiful Fibonacci Problem
这题和图论有啥关系??哦原来是放错题了。
这个题看上去很不可做,只能先去考虑一些性质。首先需要知道一个结论:斐波那契数列在模 \(10^k(k\ge 3)\) 意义下有长为 \(L=1.5\times 10^k\) 的循环节。因此可以知道 \(F_{xL}\equiv 0\pmod {10^k},F_{xL+1}\equiv 1\pmod {10^k}\)。
猜测我们每个数字找到的位置应该是固定的,不然太难做。那么我们现在需要将模数扩大到 \(10^{18}\),并且加入 \(a+id\) 这个数字。先看 \(F_{L+1}\),显然它可以写作 \(t\times10^k + 1\) 这个形式。考虑 \(F_{2L+1}\),由斐波那契数列性质 \(F_{n+m}=F_nF_{m-1}+F_{n+1}F_{m}\) 可知 \(F_{2L+1}= F_L ^2+F_{L+1}^2\)。我们希望 \(F_L^2 \equiv 0\pmod {10^{18}}\),于是 \(k\ge 9\)。取 \(k=9\),可以得到:
这个时候不难猜测 \(F_{xL+1}\equiv xt\times 10^9+1\pmod{10^{18}}\),事实上归纳可以证明该结论。然后我们就发现如果让 \(xt\equiv a+id\pmod {10^6}\) 就可以构造出一个合法解,它们的位置是固定的。那么自然有 \(x\equiv t^{-1}a+t^{-1}id\pmod {10^6}\)。取 \(x=t^{-1}a\bmod 10^6+i\times (t^{-1}d\bmod 10^6)\) 即可,代回发现:
这就达成了我们的目标,取 \(b=(t^{-1}a\bmod 10^6)L+1,e=(t^{-1}d\bmod 10^6)L\) 即可满足要求。现在的问题就是怎样算出 \(t\),其实只需要直接算出 \(F_{L+1}\) 的结果再求一下逆元即可得出 \(t^{-1}\equiv 945049\pmod {10^6}\)。最后输出即可。
B [CF1239E] Turtle
做这道题时会发现它具有很多特殊性质,关键的有三个:
-
一定存在最优解满足 \(a_1\) 单调递增,\(a_2\) 单调递减。
证明:考虑调整法。假如 \(a_{1,i}>a_{1,i+1}\),交换后转折点在 \(i-1\) 以前和 \(i+1\) 以后的路径权值不会改变,而转折点在 \(i\) 处的路径权值变小,这样一定不会更劣。
-
一定存在最优解满足 \(a_{1,1},a_{2,n}\) 是最小的两个数。
证明:依然考虑调整法。由上一个结论知最小值必在这两个位置中的一个,不妨令为 \(a_{1,1}\)。那么次小值只可能在 \(a_{1,2}\) 或 \(a_{2,n}\)。如果次小值在 \(a_{1,2}\) 那么交换到 \(a_{2,n}\) 后,转折点不在 \(1\) 处的路径权值不变,而转折点在 \(1\) 处的权值不会更劣。
-
一定存在最优解满足转折点在 \(1,n\) 中。
证明:首先令转折点在 \(i\) 处答案为 \(s_i\)。那么由递推式 \(s_{i+1}=s_i+a_{1,i+1}-a_{2,i}\)。由于 \(a_1\) 单调递增,\(a_2\) 单调递减,所以 \(a_{1,i+1}-a_{2,i}\) 单调递增。当然因为这有可能是负数,所以最大值只可能取在 \(s_1\) 或 \(s_n\) 处。
于是我们现在只需要将剩下的 \(2(n-1)\) 个数分成两半,使得两个组和的最大值最小即可。可以考虑一个朴素的背包 dp,计算出某一个组的和是否有可能是某个值 \(S\)。求出最小的最大值后从结尾状态向前推一遍即可得出答案。使用 bitset 优化后的复杂度 \(O(\tfrac1 w n^2 \sum a_i)\)。
C [CF521E] Cycling City
考虑建出无向图的一个 DFS 树,此时树上本身有一条路径,而我们要求三条路径,所以还需要找出两条路径。一个简单的想法是通过反祖边去找出这两条路径。
这就要求我们的反祖边的祖先必须在当前 \(x\) 的根链上,这个很好判断,只需要判断深度是否小于 \(x\) 的深度即可。而反祖边剩下的那个节点必须在 \(x\) 不同的子树内(或者在 \(x\) 处),否则的话会经过重复点,不满足不相交这个条件。然后我们的路径就应该是从 \(x\) 到两条反祖边中深度较大的祖先,暴力算出方案后输出即可,复杂度是 \(O(n)\) 的。
D [CF1142E] Pink Floyd
首先考虑没有粉色边怎么做。我们维护一个当前不可被某个点到达的点集合 \(S\),每次取出 \(S\) 中的两个点 \(x,y\),询问 \(x,y\) 这条边。如果这条边是 \(x\to y\),那么 \(y\) 现在就可被 \(x\) 走到了,将 \(y\) 踢出 \(S\)。这样做直到 \(S\) 中只剩下一个点,此时这个点就是答案。
考虑粉色边构成 DAG 时怎么做,依然维护上面的 \(S\),不过此时我们初始加入的不是所有的点,而是粉边入度为 \(0\) 的点,因为剩下的点此时可以被这些点走到。取出 \(x,y\) 询问后,如果 \(y\) 要被踢出 \(S\),那么我们需要将 \(y\) 指向的点的入度减一;当一个点的入度减到 \(0\) 时说明它也不可达,加入 \(S\) 即可。事实上,这个过程和拓扑排序很像。
最后考虑粉色边没有限制的情况。事实上这个也很简单,因为发现环对上述过程实际上是没有影响的,所以我们只需要把反祖边判掉即可。这样的话每个点最多删一次,而我们只有询问的时候才会删点,所以理论询问次数为 \(n-1\),可以通过。
E [CF611H] New Year and Forgotten Tree
首先我们把所有点按照位数分组考虑,然后我们有一个结论:对于每一组我们可以选出一个关键点,如果有解,一定存在一组解,使得每一条边的端点至少有一个关键点。证明的话可以考虑调整法,如果最终方案中 \((u,v)\) 均不是关键点,那么可以将 \(u\) 连在 \(v\) 的关键点上或将 \(v\) 连在 \(u\) 的关键点上。
然后我们就可以进行如下操作:我们每一次选出一条边,让某一个组中的任意一个非关键点和另一组中关键点连边,并且将这个非关键点删去。这样操作直到每一组都只剩下关键点,然后将关键点连成一棵树即可。现在的问题是对于每一条边我们应该选出哪一组作为关键点。
解决方法实际上非常暴力,我们直接枚举每一条边以哪一组作为关键点,然后判断删掉非关键点后是否还有解即可。对于判断有无解,我们还有一个结论:对于任意几个组来说,如果这些组中的点数始终大于组中连的边数,那么一定有解。证明的话考虑 Hall 定理,我们相当于是做了一个边和儿子之间的完美匹配,于是对于每个边的子集,其拓展出来的点的子集的大小不能小于这个子集的大小。再加上根节点,就要求点数必须大于边数了。
所以直接暴力枚举检查后记录答案即可。另一种办法是先枚举关键点连边情况,然后对剩下的部分跑二分图匹配。
F [CF1305G] Kuroni and Antihype
首先此题需要一个比较巧妙的转化。我们发现邀请朋友加入团伙的过程可以写成一棵树,钦定父亲邀请儿子。并且新建一个虚点 \(0\) 作为根,\(0\) 的儿子是主动加入团伙的。那么不难发现,对于一个点 \(i\),其贡献为 \(\sum a_i\times son_i\),其中 \(son_i\) 是 \(i\) 的儿子数量。如果此时我们直接建图然后跑最大生成树的话会发现边权比较难处理,考虑把每一个点的贡献加一,这样的话一个点的贡献就可以分配到它的所有连边上。
总结起来讲就是,我们对满足 \(a_i\ \text{AND}\ a_j=0\) 的 \(a_i,a_j\) 之间连边,边权为 \(a_i+a_j\),然后跑最大生成树,再减去 \(\sum a_i\) 就是答案。此时我们已经可以直接利用 Kruskal 求出最大生成树了,由于枚举边权后要枚举子集,所以复杂度是 \(O(3^{18} \alpha(n))\) 的,可以通过。
G [ARC103F] Distance Sums
考虑如果我们以树的重心为根的话,从根走到叶子时 \(D_i\) 一定在不断变大。也就是说 \(D_i\) 最大的一定是叶子节点,并且由于叶子节点的 \(siz=1\) 我们还可以算出这个叶子节点的父亲的 \(D_i\) 值,由于 \(D_i\) 互不相同,我们就可以唯一确定这个叶子节点的父亲。我们给它父亲的 \(siz\) 加上 \(1\),然后这个叶子节点对答案就不会再有什么影响了,可以删去。然后再去看剩下部分,显然还是相同的子问题,我们通过当前最大的 \(D_i\) 值和它的 \(siz\) 算出父亲,然后给父亲贡献对应的 \(siz\) 即可。
然后考虑怎样判掉无解,首先如果这个 \(D_i\) 没有对应的节点显然无解;其次上述过程实际上只满足了每个点 \(D_i\) 的相对大小正确,我们实际上不知道每个点最后算出来的 \(D_i\) 对不对。所以再跑一边树形 dp 算出真正的 \(D_i\) 后比对一下即可。这里我们可以只比对重心。复杂度是 \(O(n\log n)\) 的,瓶颈在排序。
H [AGC025E] Walking on a Tree
首先观察样例发现答案总能取到上界,即若第 \(i\) 条边被覆盖 \(c_i\) 次,答案为 \(\sum \min(2, c_i)\)。
我们考虑建一个新图 \(G\),对于一条路径 \(u_i,v_i\),我们连边 \((u_i,v_i)\)。此时不难发现,如果新图中每一个联通块都有一条欧拉回路,那么我们按照欧拉回路去对路径定向一定是最优的。原因在于这样可以保证每一条树边都会被正反覆盖到,并且正反覆盖次数是相同的。于是我们就可以取到答案上界。
不过有欧拉回路的情况并不是大多数,更多的情况是没有欧拉回路。这个时候我们想到去构造出欧拉回路。具体做法就是添加树边使得每个点度数为偶数。我们从下往上跑,对于每个节点 \(x\),如果其有儿子度数为奇数,那么连边。这样的话我们再跑一遍欧拉回路定向即可。这样做可以取到最优解的原因在于,欧拉回路是可以保证每条边正反覆盖次数相同的,而新增加的树边只会最多带来 \(1\) 的贡献,所以这样下来每一条边被正反覆盖次数最多相差 \(1\),显然这样可以取到答案上界。
所以只需要求一下 \(c_i\) 然后跑一个欧拉回路即可。前者树上差分可以做到 \(O(n\log n)\) 或 \(O(n)\);后者由于我们只用定向,所以只用跑环即可,使用当前弧优化可以做到 \(O(n)\)。实际上是爆标了。
I [AGC033F] Adding Edges
首先题目里要求 \(a,b,c\) 是以任意顺序出现,这个非常不好,我们给它改成以固定顺序出现。这样的话不难发现,在最后的图中两个点 \(x,y\) 有边相连的充要条件是:存在若干个点 \(a_1,a_2,\cdots a_k\),满足 \(a_1=x,a_k=y\),并且 \(a\) 中相邻两个点都在 \(G\) 中有连边,且所有点在 \(T\) 中某条路径上顺次出现。这个我们可以直接在树上枚举起点跑 DFS 得出答案。
现在考虑如何将题目中的条件改成这个条件。不难发现,如果 \(T\) 中某条路径上顺次出现了 \(a,b,c\) 三个点,且他们在 \(G\) 中有边 \((a,b),(a,c)\),那么这样得出的答案和连边 \((a,b),(b,c)\) 得出的答案是一致的。而后者正是我们想要的形式。所以现在我们的目标就是将所有这样的边重新连起来。
考虑增量构造,将 \(G\) 中的边一条条加入。设 \(L(x,y)\) 表示往 \(G\) 中加入边 \((x,y)\) 的操作;同时维护一个 \(f(x,y)\),表示如果 \(T\) 以 \(x\) 为根,与 \(x\) 相连的离 \(y\) 最近且是 \(y\) 的祖先的点是什么。那么我们有如下操作:
- 如果 \(f(x,y)=y\),说明这条边已经存在,不用操作。
- 如果 \(f(x,y)\) 存在且 \(\ne y\),那么此时我们的连边是 \((x,f(x,y)),(x,y)\),按照上面的分析我们应该转化成 \((x,f(x,y)),(f(x,y),y)\)。所以接下来执行 \(L(f(x,y),y)\)。
- 如果 \(f(x,y)\) 不存在,首先令 \(f(x,y)=y\),然后遍历以 \(x\) 为根 \(y\) 的子树,如果 \(f(x,v)=0\) 则将其改为 \(y\);否则的话此时我们已经连边 \((x,f(x,v)),(x,y)\),按照上面的分析我们应该还要加上一条边 \((f(x,v),y)\),所以执行 \(L(f(x,v),y)\),并且不再继续向下递归子树。
注意我们加的是双向边,所以还要加一下 \((y,x)\)。考虑时间复杂度,我们每一次搜索要么把一个没有值的 \(f\) 赋值;要么是去修改一条边,使其缩小到另一范围。前者最多执行 \(O(n^2)\) 次,而后者最多执行 \(O(nm)\) 次,所以复杂度是 \(O(n^2+nm)\) 的,可以通过。
J [CF1264E] Beautiful League
首先直接数三元环是困难的,考虑正难则反,求出所有三元组数量减去不是三元环的三元组数量。对于后者,不难发现,如果一个 \(a\) 同时赢了 \(b,c\),那么 \((a,b,c)\) 就不是三元环。所以我们可以知道,如果 \(x\) 赢了 \(a_x\) 场,那么三元环个数总共会减少:
我们要尽可能最小化这个值。关注到这是一个有关比赛输赢的题,不难想到一个经典题 [JSOI2009] 球队收益 / 球队预算。考虑建立费用流模型,对比赛和球队建点,从比赛向其双方的球队各连一条边,走哪表示谁赢。然后要看每个人赢所带来的贡献,关注到每一个人的贡献拆开是 \(\tfrac{1}{2}({a_i}^2-a_i)\) 的形式,这是一个平方费用,那么按照传统艺能作差分,从每个点向汇点依次连费用为 \(0,1,2,\cdots n-1\) 的边即可满足条件。
最后跑最小费用最大流即可。构造答案直接根据残量网络上的信息看每一场谁赢即可。
双倍经验:[WC2007] 剪刀石头布。
K [CF1338E] JYPnation
首先题目中给出了一个性质:不存在三元环向同一个点连边。考虑竞赛图缩点后会形成链状结构,而如果前面的强联通竞赛图中有不止一个点,根据竞赛图的性质,我们知道这中间肯定有一个三元环,那么这个三元环就会指向后面的同一个点,不符合题意。所以我们有如下推论:
\(\mathbf{Lemma\ 1}\):缩点后的图除了最后一个 SCC 外,其余 SCC 中最多有一个点。
然后可以发现,如果两个点不在同一 SCC 中,则其对答案贡献为 \(1+614n\)。然后前面大小为 \(1\) 的点我们就处理完了。现在只需要考虑最后一个强连通竞赛图的情况即可。接下来我们还有一个重要引理:
\(\mathbf{Lemma\ 2}\):对于任意两个点 \(x,y\),\(dis(x,y)\le 3\)。
证明:考虑写出 \(x,y\) 的最短路,假设其为 \(p_1,p_2,\cdots ,p_k\),满足 \(p_1=x,p_k=y\)。那么为了满足这是最短路,我们对于任意 \(p_i\),必然要将其向 \(p_1,p_2,\cdots,p_{i-2}\) 连边。注意到此时如果 \(k> 4\),那么会构成三元环 \((p_{i-2},p_{i-1},p_{i})\),并且它们都会指向 \(p_{i-4}\)。显然这不满足条件,所以 \(k\le 4\),于是最短路一定 \(\le 3\)。
那么对于这个非平凡的 SCC,我们只需要统计其中 \(dis\) 为 \(1,2,3\) 的点对数。显然 \(dis=1\) 的有 \(\binom{n}{2}\) 个,而剩下两部分加起来总共有 \(\binom{n}{2}\) 个。我们只需要统计一个即可,显然考虑统计 \(dis=2\) 的点对数。
考虑这个如何统计。如果暴力显然是 \(O(n^3)\) 的,用 bitset 优化也不可行。考虑这样一件事:假如 \(dis(u,v)=2\),那么说明存在 \(a\) 使得 \(u\to a,a\to v\) 且 \(v\to u\)。那么此时如果还存在一个点 \(b\),满足 \(u\to b\) 且 \(a\to b\),那么一定有 \(b\to v\)。因为如果不是的话就会存在三元环指向同一个点的情况。
既然如此,我们可以找出 \(u\) 的所有出点集合 \(S\),并求出其导出子图 \(G'\)。这个导出子图必然有拓扑序,否则的话就会存在三元环指向同一个点。我们只需要找出这个导出子图中拓扑序最大的点,它的所有出点就是所有可能合法的 \(v\),判断一下即可。这样的话我们的复杂度就是 \(O(n^2)\) 的了。实际中并不需要真的求出导出子图,直接遍历一下出点集合 \(S\) 即可。
于是我们在 \(O(n^2)\) 的复杂度内解决了这个问题。
L [UOJ670] [UNR #5] 获奖名单
首先我们先从简单的情况开始考虑。假设最终回文串长度为偶数且可以中心没有字符串跨过,那么我们就可以把它劈成两半,然后将后面反转,这样两个串就必须一致了。接下来不难发现两个串可以分成若干个部分,每个部分之间没有字符串跨过。那么不难发现只有下面三种情况:
- 单个字符对单个字符。
- 两个字符对两个字符。
- 形如 \(a_1,(a_1,a_2),(a_2,a_3),\cdots,(a_{k-1},a_k),a_k\) 的链交替分布在两个串中。
考虑构建图论模型解决这个问题。对于单个字符 \(a_i\),我们建边 \((0,a_i)\);对于两个字符 \((a_i,b_i)\),我们建边 \((a_i,b_i)\)。这样不难发现,上面的情况除了第二种以外,都可以形成一条从 \(0\) 开始的欧拉回路。所以我们直接跑一下欧拉回路即可,然后剩下的字符串两两匹配。
然后就是更一般的情况了。我们先考虑中心被一个字符串穿过,这个很简单,因为最后配对时它一定没有可以配对的,把它单独放到中间即可。然后考虑奇数的情况,此时我们会多出一个字符,发现这和上面的区别只在于我们从欧拉回路变成了欧拉路径,所以跑一遍欧拉路径即可。复杂度是 \(O(n+m)\) 的。
M [UOJ605] [UER #9] 知识网络
首先我们先处理一下同种标签之间互相转移的问题。这个套路就很经典了,我们新建一个虚点 \(x\),对同一种标签内的点和 \(x\) 之间连边即可。然后这就是一个全源最短路,直接跑的话比较难以通过。
考虑发现一些性质,由于标签数很少,所以我们考虑从标签下手。由于同一个标签内的点可以互相抵达。所以对于在同一个标签内两点 \(x,y\),\(|dis(x,p)-dis(y,p)|\le 1\)。那么我们就可以以这个标签内所有点为起点跑最短路,求出到其它点的距离。接下来建立最短路图,显然由于没有 \(0\) 环,这是一个 DAG。接下来对于图上每一个点,利用 bitset 算出有多少个标签内的点可以在最短路图上走到它。如果能走到则说明 \(dis\) 不变,否则说明 \(dis\) 要加一。
前者的复杂度可以用 0-1 BFS 做到 \(O(km)\),后者的复杂度则是 \(O(\tfrac{n^2}{w})\) 的。不过后者的空间复杂度是 \(O(\tfrac{n^2}{w})\) 的,并不能开下。那么再考虑另一个经典套路,即 bitset 分块,每一次只处理 \(w\) 个点的可达性,复杂度依然是 \(O(\tfrac{n^2}{w})\),但是空间就降到了 \(O(n)\)。
N [UOJ32] [UR #2] 跳蚤公路
考虑我们此题就是找出一个 \(1\to v\) 的负环,不过我们的负环需要有一个权值 \(x\)。实际上可以发现,如果一条路径的 \(s\) 之和为 \(\sum s\),\(w\) 之和为 \(\sum w\),则该路径权值为 \(\sum s\times x+\sum w\)。
我们考虑判负环的方式,有用的有 Floyd 和 Bellman-Ford(SPFA 和 Bellman-Ford 没啥本质区别)。Floyd 太慢不考虑。考虑 Bellman-Ford 是怎样判负环的,我们设 \(f(i,u)\) 表示 \(i\) 轮松弛后到 \(u\) 的最短路,则存在负环当且仅当存在 \(u\) 使得 \(f(n,u)<f(n-1,u)\)。考虑套用到本题,我们再记录一个状态 \(S\) 表示当前 \(\sum s= S\),显然 \(S\in [-n,n]\)。那么我们走到 \(u\) 的最短路就是 \(\min\limits _S Sx+f(n-1,u,S)\)。
根据上面的结论,我们不存在负环当且仅当 \(\min\limits_k kx+f(n,u,k) \ge \min\limits_j jx+f(n-1,u,j)\)。只需要解出这个不等式的解集即可。首先前面的 \(\min\) 可以摘掉,即 \(kx+f(n,u,k) \ge \min\limits_j jx+f(n-1,u,j)\),然后接下来摘掉后面的 \(\min\),此时对于每一个 \(j\) 会有一个解集,我们只要求它比最小的大,所以取并集即可。
然后此时我们发现如果只限制松弛 \(n\) 次,那么负环可以到达的点我们并没有处理,所以对于当前点的所有可达点,它们不存在负环的情况需要和当前点的解集取交。实际操作中由于多个集合取交有些困难,我们可以对所有集合取补集,这样前面的操作变为求交集而这个操作变为求并集,这个就好处理一些了。
O [UOJ552] [UNR #4] 同构判定鸭
先考虑 DAG 上怎么做。我们发现两个图同构当且仅当两个图能生成出的字符串集合相等。由于 DAG 的性质实在太少,所以我们考虑利用哈希判断。考虑设 \(f(x,i)\) 表示从 \(x\) 开始走 \(i\) 步走出的所有字符串的哈希值之和,那么为了方便在 DAG 上 dp,我们可以设哈希值为每一位的哈希值相乘,这样转移方程会简单一些。
接下来考虑构造答案,首先我们枚举答案长度,如果有一个长度 \(k\) 满足 \(\sum f_1(x,k)\ne \sum f_2(x,k)\),那么显然这就是不合法的。然后贪心枚举每一位,假设当前枚举出来的字符串为 \(S\),令 \(g(x)\) 表示以 \(x\) 结尾的匹配上 \(S\) 的路径条数。那么这个 \(S\) 不合法当且仅当 \(\sum g_1(x)f_1(x,k-len(S))\ne \sum g_2(x)f_2(x,k-len(S))\),这表明剩下 \(k-len(S)\) 位的字符串集合不一样。显然这样做的复杂度是 \(O(nm)\) 的。
然后考虑怎样在一般图上做。发现上面唯一需要修改的是答案上界,在 DAG 中上界一定是 \(\min(n_1,n_2)\)。而在一般图中,可以证明,答案上界是 \(n1+n2\)。具体的证明可以看官方题解,由于我实在不会线性代数所以只能贺。所以我们只需要把上界开大就能过了。当然在考场上你可以猜测答案上界然后通过。
P [UOJ461] 新年的 Dog 划分
首先考虑一个 \(O(n^2)\) 的做法。我们考虑求出二分图的一个生成树,只要求出这个生成树我们就可以直接黑白染色求出二分图的两个部分。我们考虑按顺序删除每一条边,如果这条边删除后图不联通,那么说明它是树边,我们需要保留;否则的话说明这是非树边,可以一直删去。
接下来先讲解一下怎样判断无解。我们一定可以构造出一个生成树,并以此染色成两个点集 \(S,T\)。我们知道图不是二分图当且仅当存在奇环,那么在生成树上删掉奇环上的一条边再加上一条边一定还是联通的。据此我们有如下判断方式:先删去 \(S,T\) 之间所有非树边,如果一定存在一条树边,使得删去这条树边后图依然联通,那么图就不是二分图。
然后考虑优化上面的算法。实际上由于树边只有 \(n-1\) 条,所以暴力找其实很不划算。我们可以每次二分,看删掉编号在 \([1,mid]\) 中所有边后图是否依然联通,并以此转移二分区间。这样我们总共二分 \(n-1\) 次,每次二分 \(\log n^2 =2\log n\) 次,总询问次数 \(2(n-1)\log n\),很可惜还是不能通过最后一个 Subtask。
考虑进一步优化,发现我们没有必要每一次对所有边进行二分,而可以改为求出与每一个点相连的点。这样我们就是在点上进行二分,总次数依然是 \((n-1)\) 次,不过每次二分的次数只有 \(\log n\),所以总次数是 \((n-1)\log n\) 的,可以通过。

浙公网安备 33010602011771号