显然有一个暴力是按 \([u_i\leq k]+[v_i\leq k]\) 为边权跑最大生成树,但是看起来不是很好维护的样子。
发现我们只需要考虑当前边权为 \(1\) 或 \(2\) 的边。于是最多我们只需要考虑所有小于等于 \(k\) 的点与与它们相邻的点。
我们可以先只考虑目前边权为 \(2\) 的边,每一次访问到一个 \(k\) 就去找 \((k,v)\in E,v\leq k\) 的点 \(v\),如果 \(v,k\) 还不联通那么它们一定加一条边权为 \(2\) 的边从 kruskal 分析一定不劣。
那么加完之后我们考虑新加一个边权为 \(1\) 的边。即找 \((k,v)\in E,v>k\)。如果 \(v\) 在之前没有被之前已经加入的点所包含那么我们不能加入,否则可以加入。开另外一个并查集维护即可。