【20231018算法进阶班】NOIP训练赛#23 赛后总结
做题历程
8:00 ~ 8:40
看A做A,甚至去证明了一下贪心正确性。
8:40 ~ 9:30
看了看B,感觉那个式子很有简化的空间。
简化完后就会做了。
瞄了一眼C,C是期望先跳过。
D一眼根号分治,不好写,就先不写了。
9:30 ~ 10:30
去写B。写了一个线段树,傻了。
写完B之后去看C,C想到了做法。
10:30 ~ 11:20
写C。
11:20 ~ 11:40
写了D的暴力。
11:40 ~ 12:00
检查。
总结
-
数据结构的使用要正确。
-
有时间应该思考优化方式。
题解
A
贪心,不过有的人用错误的方式也通过了此题。
B
化简式子,发现可以维护 \(b_i\) 数组的系数的前缀和,就没了。
C
统计每条边走过的期望次数,维护一下连接一个点的边的期望和。
D
根号分治,提示得很明显。
但是这道题使用 \(O(n\sqrt{n} log\ n)\) 的做法会T。
所以对于 \(x > \sqrt{n}\) 的时候,我们需要更优的做法。
因为要 \(O(1)\) 区间修改,所以我们考虑维护差分数组。
用差分数组维护区间和:
\[\sum_{i=l}^{r}\sum_{j=1}^{i}c_j = (r-l+1)\sum_{i=1}^{l-1}c_i + \sum_{i=l}^{r}(r-i+1)\times c_i = (r-l+1)\sum_{i=1}^{l-1}c_i + (r + 1)\sum_{i=l}^{r}c_i - \sum_{i=l}^{r} i \times c_i
\]
发现转化完的式子的每一部分我们都可以使用分块维护,做完了。
但是这题非常坑的是他会爆 long long,如果直接开 __int128 又会被卡常,艹。
除此之外就没了,很好的分块,很差的数据。

浙公网安备 33010602011771号