- 1003 Question for the Leader
经典结论:如果可以把这颗树分成大小都为k的n/k份,那子 树大小是k的倍数的节点恰好有n/k个。(根可以任选)
反过来思考,想像一棵被分成n/k个,节点数为k的子树,每棵子树的根为深度最浅的节点。将这些子树拼接回去,这时候那些根节点的sz依然是k的倍数。顺着这个思路,可以将该树分成n/k棵大小都为k的子树。 1004 Route Statistics
为啥没想到dp?挺好的一题。1005 Simple Problem
很好的一题。树的最小点覆盖,可dp解决。
define:- f[v] : 子树v的最小点覆盖,不选v
- g[v]: 子树v的最小点覆盖,选了v
f[v]=∑song[son],g[v]=1+∑sonmin{g[son],f[son]}
到这里还不够,每次动态添加一个叶子节点。g[v]的递推式很难维护。
对于g[v]和f[v],都表示子树v的最小点覆盖。从贪心的角度考虑,v是边缘点,因此g[v]不会比f[v]更优,因此g[v]>=f[v]。从而
f[v]=∑song[son],g[v]=1+∑sonf[son]
这样表达式就变得优美易于维护了。
表达式越简单越好,善于发现关键关系。
- 1006 Test for Rikka
转化的很好,从矩阵乘法转移到长为l的路径数。然后构造。 1007 Undirected Graph
询问节点集为 [li,ri] 的导出子图的联通块个数。
不得不说,好题,思路精妙。
首先考虑连通块计数。对于一个节点数为V,连通块个数为B,边数为E的森林,有V = B + E 。因此可以通过统计边的数量来求连通块数量。于是对于 [li,ri] 的导出子图,我们维护其生成森林即可。
先将询问按照右节点排序,然后从左向右加点加边。处理到i时,这是处理的询问是 [j,i] ,这是讲所有边 (v,i),v<i 加进来,可能会加了(v,i), (u,i),但此时(u,v)已经连通,则此时要断开(u,v)。统计边数时,即统计边 (u,v),l<=u,v<=r 的数量,将u作为边(u,v)的编号,统计[l,r]之间的数即可。方法论
- dp
- 发现并简化关系,表达式
- 联想,构造
- 生成树维护,连通块计数
- 树状数组解决了二维偏序:从左向右添加,第一维;前向和,第二维。