2.22 —— 949C
949 C
限时每日一题day2。这一次做出来了,但时间花得有点多,再接再厉吧。
一个不难的构造题。
首先能发现 以任意两个非 \(-1\) 的相邻两数为端点 形成区间的答案 与 其他位置的答案 是独立的,因此问题转化为给定两个正数 \(x,y\),中间夹着若干个 \(-1\),能否正确填充。
将数看作二进制,则题目给定的三个操作本质上可看作:
- 向右移一位
- 向左移一位,末尾填0
- 向左移一位,末尾填1
将 \(x, y\) 的前导0去除,然后再取 \(x,y\) 的高位公共前缀,对两个数剩下的若干低位操作,可以证明这样的操作次数是最少的。
有解的前提是操作数要足够,即 \(-1\) 的数量要够;其次要满足做完上述操作后剩下的操作次数是偶数,才能保持这种构造形式(若剩下奇数次,则最终状态一定改变),否则一定无解。
对所有这样的 \(x,y\) 检验即可,前缀与后缀的 \(-1\) 显然可以直接构造;而操作可以只用上面的操作 \(1\),以简化构造过程。具体细节见代码。