【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 又会被卡常,艹。

除此之外就没了,很好的分块,很差的数据。

posted @ 2023-10-19 20:31  PeyNiKge  阅读(14)  评论(0)    收藏  举报