A. two

考虑现在要通过蓝边删掉红边。

其实等价于要找出有哪些红边,满足恰好只有一个端点在蓝边的儿子方向子树中。

考虑对蓝树跑出一个 $dfs$ 序来,那么问题转化为恰好一个端点在给定区间中。

这像是一个二维偏序问题。考虑以线段树下标为其中的第一维,第二维进行排序处理。

然后用一个 $set$ 就可以简单维护了,但是这样做的复杂度是两个 $log$ 的。

考虑一个特殊的操作,开两棵线段树,第一棵以连接两个点中小的 $dfs$ 序为下标,大的为权值,第二棵则相反。

那么问题就转化为取一段前缀或后缀了,因为本题只需要每个边操作一次,用单调指针就可以维护了。 

 

B. bracket

显然要搞一个点分治。然后只要统计经过当前分治父亲的路径。

然后就是常见的我想不到的。

发现从分治父亲到一个子孙的路径合法的条件是,路径权值的总和是路径上的最值。

而出现次数就是这个最终出现的次数,两条路径配对的条件是总和互为相反数。

把这些东西都处理出来,发现问题是个卷积。

但是直接分析复杂度似乎是三个 $log$ 的。

考虑如果说对于一个权值和出现的子孙个数为 $t$,那么多项式的级数也是 $t$ 级别的,因为次方数增加 $1$ 至少导致节点数增加 $1$。

所以直接做一个 $fft$ 优化一下卷积就结束了。

 

C. sum

一个结论,考虑最终被选上的数含有的质因子不超过两个。

并且如果质因子个数为 $2$,那么一定可以表示为$p_1^k*p_2$,其中 $p_1 \leq \sqrt n,p_2 > \sqrt n$。

有了这个结论,可以发现把质因子按照是否大于 $\sqrt n$ 分在二分图的两部分,直接跑一个最大费用可行流就可以解决问题。

然而这个玩意跑的有点慢,所以过不去。

考虑一个优化,首先分别令每个质因子统计一下答案,然后只把能够增广的边建出来就完事了。