今天的题目质量很高,至少我想写了!真是太好了。
CF1146F Leaf Partition
开始有个 \(dp_{i,0/1}\) 表示点 \(i\) 是否加入了某个连通块……但是好像不太能做(实际上可以)就丢了。
还是考虑儿子和父亲之间的关系。定义 \(dp_{i,0/1}\) 表示 \(i\) 跟父亲不在或在同一个连通块的方案数。考虑由儿子更新父亲。
如果 \(u\) 没有儿子表示要和父亲在同一连通块,那么 \(u\) 一定不会和父亲在同一个连通块;
如果 \(u\) 有一个儿子表示要和父亲在同一连通块,那么 \(u\) 一定会和父亲在同一个连通块,否则父亲会脱离那个唯一的儿子的连通块(此时在 \(u\) 的祖先有另一个子树内有一个点与 \(u\) 在同一个连通块);
否则,\(u\) 首先可以自成方圆,\(u\) 所在的连通块的所有点确定;或者是 \(u\) 把父亲并入同一个连通块,跟第二种情况无本质区别。
那么,记上面三种情况的方案数 \(g_0,g_1,g_2\),那么 \(dp_{u,0}=g_0+g_2,dp_{u,1}=g_0+g_2\)。
算 \(g\) 是幼儿园 DP。
CF1140G Double Tree
首先显然看成一棵树然后两个状态,在某个点状态转变有代价。
注意到求树上的一条最短路径,首先在有状态转变的情况下我们不好搞,因为最短路径不一定是简单路径。我们需要松弛 \(u \to u'\) 的权值。这个可以用两次 dfs 解决(因为 \(u \to u'\) 的路径上状态最多转换一次。处理 \(i\) 时,你先通过以以 \(i\) 为根的子树内的某一点为转换点的权值松弛 \(i \to i'\),然后再通过上面的点松弛下面的点,正确性显然),不在话下。
然后就是大傻逼倍增题,写写就过了。
HNOI2014 世界树
写你妈,
我写了,就是纯傻逼。