tg 19 题解
count
\(\color{black}{C}\color{red}{Dsidi}\)提供了一条链的\(Hack\)卡掉了正解%%%
\(\color{black}{S}\color{red}{akura}\)提供了新的正解%%%
应该能看出来:
1.块大小不同的合法方案对于每个合法块数来说有且仅有一种
2.不能做\(n\)因数的显然不能成为合法方案
于是:
对于每个因数的合法性,进行\(DFS\)检验
子树大小小于当前值返回本身大小
等于返回\(0\),贪心直接割
这样就有了这个:
如果一个子树大小在已经割掉所有块大小的情况下仍然大于当前限定大小
显然这是由若干个小于当前值的块拼好的,所以无论如何割都不合法
这样就是赛时正解,但是时间复杂度上界是\(O(N\sqrt{N})\)
跑\(N=1e6\)多少有点太费劲了,考虑优化
于是有julao研究出的一个式子:
\(ans=\sum\limits_{d|n} [\sum\limits^{n}_{i=1}[size[i]=0]=\frac{n}{d}]\)
于是这样就可以过掉了
顺嘴一提,一条链做,方案数直接是约数个数
序列
考虑转换题意,求最少的变化相当于求最多的不变
考虑什么时候不会变
当且仅当满足\(\forall i,j,a[i]-i\ge a[j]-j\) 的时候,命题成立
于是问题就转化成了求最长不下降子序列问题
这样直接二分栈就随便过了
最远点对
线段树的一个问题
春节十二响
先考虑一条链的情况,如果根节点不在链的两端,而在链的中间,很容易想到从根节点的两个儿子的链中,
用两个优先队列维护两条链的所有权值,每次取两边最大的值取 ,求和即是答案
不妨将这个做法拓展到一颗树上,将\(x\)结点的所有儿子维护的优先队列进行合并,
注意合并时要用启发式合并,即小的堆合并到大的堆里去
将儿子的所有值合并后,再把\(x\)的权值放入堆中,这样就可以让所有合并的点之间不存在祖先关系
最后根节点维护的优先队列的所有值的总和即是答案

浙公网安备 33010602011771号