日记

日记

周三 10月 15 2025
725 字 · 3 分钟

还是改不掉看到数数题和概期题就害怕的习惯。

不是所有的概期都要 dp

设能在 kk 时刻内点燃第 ii 棵树的区间是 [li,ri][l_i,r_i],那么显然,第 ii 棵树被点燃的概率是 1j=liri(1aj)1 - \prod_{j = l_i}^{r_i}(1 - a_j)。把这些都加上就是了,可以很容易的做到 O(n2)O(n^2)

观察到 lil_irir_i 都是单调递增的,于是直接双指针做到 O(n)O(n)

注意处理 ai=1a_i = 1 的情况,因为 00 没有逆元。

捐赠

大样例一定要测

有显然的结论:aa 中取的个数加上 bb 中未取的个数等于 bb 的总数。我们考虑把求解“取最大的 kkbb”改成求解“取最小的 cntbkcntb - kbb”。

使用一颗权值线段树维护 aabb,我们在插入 aa 的时候正常插入,在插入 bb 的时候插入将要插入的树的相反数,答案就是 sumbsumb 减去权值线段树里最大的 cntbcntb 个数的和,时间复杂度 O(mlogV)O(m \log V)

但是大家都是 O(mlog2V)O(m \log^2 V) 过的。。。出题人紧急加了一组 hack。。。

染色

我们有朴素的 dp 方程。因为如果一颗子树内还没有染完色,那么剩下的叶子节点的 cuc_u 一定相同。所以我们可以设 dpu,xdp_{u,x} 表示 uu 的子树内还没有染完色,还需要一个染色为 xx 的祖先的方案数。而 dpu,0dp_{u,0} 表示这个子树已经染完色了,不用再染了。

转移方程如下:

dpu,x=vsonu(dpv,0+dpv,0)vsonudpv,0dpu,0=(m+1)vsonudpv,0+i=1mdpu,i\begin{aligned} dp_{u,x} & = \prod_{v \in son_u}(dp_{v,0} + dp_{v,0}) - \prod_{v \in son_u}dp_{v,0} \\ dp_{u,0} & = (m + 1)\prod_{v \in son_u}dp_{v,0} + \sum_{i = 1}^{m}dp_{u,i} \end{aligned}

也是很好理解啊。边界就是对于每个叶子:dpu,0=dpu,cu=1dp_{u,0} = dp_{u,c_u} = 1。这个转移方程可以很容易的做到 O(n2)O(n^2),考虑如何优化。

钱神讲了一个神秘的优化方法:重剖优化 dp。我们每次先处理 uu 的重儿子,让 dpudp_u 直接继承 dpsonudp_{son_u} 的值。然后每次暴力合并剩下的轻儿子。

但是合并的时候有许多的细节。我们看到,dpv,0dp_{v,0} 要对 x[1,m] dpu,x\forall x \in [1,m] \ dp_{u,x} 做出贡献,但是如果每次暴力让 dpu,xdp_{u,x} 去乘上每个 dpv,0dp_{v,0} 的话,时间复杂度原地退化。所以我们对于每个 uu 记录一个 tagutag_u,表示这个 uu 里的每个 dpu,xdp_{u,x} 都要乘上一个 tagutag_u。当然这个 tagutag_u 也是直接从重儿子继承的啊。维护 tagutag_u 只需要在每次转移 vv 的时候,让 tagutag_u 乘上 dpv,0×tagvdp_{v,0} \times tag_v 就是了。

时间复杂度 O(nlogn)O(n \log n),因为重链只剖的出来 O(logn)O(\log n) 层。

后日谈

什么时候能看到计数题和概期题不害怕呢?


Thanks for reading!

日记

周三 10月 15 2025
725 字 · 3 分钟