模拟19 题解
A. count
结论题
一棵树可以被分为d块,
当且仅当子树节点个数和为d的倍数的节点有$\frac{n}{d}$个。
对于任何一个树,size为d的倍数的节点个数不会超过$\frac{n}{d}$个。
在以上情况下,在每个符合的节点与父亲的路上截断,是一种合法方案。
故得证。
B. Dinner
将圆上的序列划分为k段连续的区间,使区间总和的最大值最小。
显然的二分答案。
然而验证需要$O(n^2)$。
倍增预处理出每个点向后延伸$2^k$段能到达的节点。
于是对于每次验证,预处理和查询的复杂度都为$O(nlogn)$,
总复杂度$O(nlog^2n)$,
应当积累的是倍增的思想,与一些快速幂,映射都常结合使用。
C. chess
建图,发现图中存在点权为0和点权1的点。
定义不同的路线为经过至少一个不同的点权为1的点。
将点权为0的点缩掉,
也就是说,如果存在a->b->c,其中b的点权为0,直接由a向c建边。
之后直接最短路计数即可。