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)\)是怎么做到的。
代码
你猜猜为什么没有代码~