CF1705E Mark and Professor Koro(线段树)

CF1705E Mark and Professor Koro

解题思路

我们可以知道,这里面可能会发生连锁反应,每次我们加入一个数字,就可能会导致前面一整条“链”不断合并,最后成为一个数。

比如说,我们现在有 \(x,x+1,x+2,\dots,y\),我们再加入一个 \(x\),我们这一串数字就会消失,化为一个数 \(y+1\)

这个过程是不是有点熟悉?没错就是二进制加法。消失的过程就是进位。

于是我们的答案就是 \(log(\sum\limits_{i=1}^n 2^{a_i})\)

我们如何解决这个新的带修问题捏?显然需要数据结构。

官方题解里提到了两种解法,第一种是用 bitset,不过我没看懂(他代码里好像是手动实现bitset的,很恐怖)。

我比较推荐第二种,用线段树解决。我们需要进行的操作是找到一个连续的 “1” 的段,可以二分这个末位置,然后懒标记修改。删除操作就是找连续的 “0”,实际上是一样的。

时间复杂度 \(O(n \log^2 n)\),是完全没问题的。不过不太清楚官方题解里 \(O(n\log n)\)是怎么做到的。

代码

你猜猜为什么没有代码~

posted @ 2022-07-18 22:53  huayucaiji  阅读(57)  评论(0编辑  收藏  举报