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$ 分在二分图的两部分,直接跑一个最大费用可行流就可以解决问题。
然而这个玩意跑的有点慢,所以过不去。
考虑一个优化,首先分别令每个质因子统计一下答案,然后只把能够增广的边建出来就完事了。
原文地址:https://www.cnblogs.com/skyh/p/12398084.html