CF2037E 题解

CF2037E 题解

题意

给定一个长度为 n01 串,定义 f(l,r)lr 区间内 01 子序列的数量,通过最多 n 次交互,确定这个 01 串的构成。

分析

可以从莫队的思想,也就是增量,来思考如何解决。

如果说我们已经知道了 f(l,r)=ans ,接下来我们询问 f(l,r+1) 的值,相当于往 [l,r] 的串的后面接了一个字符上去。

  • 如果这一次询问的答案不同于 ans ,说明有新的 01 子序列产生,那么一定是引入了一个 1 导致的。
  • 如果这一次询问的答案和 ans 相同,那么有两种情况。
    1. r+1 位引入的是一个 0
    2. r+1 位引入的是一个 1 ,但是 [l,r] 内一个 0 也没有。

为了方便,我们直接利用上述原理从左到右构建这个串,也就是从小到大地询问 f(1,i),2in 的答案。

那么首先需处理第一个答案非零的位置,这说明当前这一位一定是 1 ,并且前面是 11...100..0 的结构(因为前面的询问得到的答案都是 0 ),具体来说,前面 0 的个数就是当前这一次询问的答案(注意前面不一定有 1 ,但一定有 0 )。

接着我们就可以继续安心地询问了,由于我们确保了已经有若干个 0 出现在串中,那么如果当前得到的答案和上一次相同,当前位就一定是 0 ;否则就是 1

唯一一种无解的情况,就是我们始终没有询问到一个非零的答案,这样的话这个串可能是 1111..1111 ,或者 000..000 ,亦或是 11..11000...000 ,所以是无法确定的。

Code

posted @   Hanggoash  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示