我们可以把一支军队(u, v)拆分为两个(u, lca)和(v, lca) 考虑一个点x,什么时候军队对它有贡献,肯定是u或v在他的子树内,且lca在他的子树外 因为需要让至少k个军队能够完全覆盖,所以肯定是选深度第k小的 这个过程可以用dfs序+***树来实现 拿(u, lca)来说,在dfn[u]对应的线段树中,dep[lca]处+1即可。 然后查第k大即可 /**/ #include<cstdio> #include<vector> using namespace std; const int MAXN = 2 * 1e5 + 10; inline int re...