CF1081F Tricky Interactor

CF1081F Tricky Interactor

Description

这是一道交互题。

有一个长度为 \(n\) 的 \(01\) 序列,初始时 \(1\) 的个数为 \(t\)。定义一次操作为给定 \(l, r(l \le r)\),交互库会等概率地从区间 \([1, r]\) 和 \([l, n]\) 中选择一个,然后翻转下标在该区间内的数(翻转即 \(x \to 1 - x\)),并告诉你翻转完的序列中有多少个 \(1\)。操作之间不是独立的,即对序列的修改是永久的。

你需要在 \(10000\) 次操作内得出原始的序列。

\(n \le 300\)。

Solution

设这个序列为 \(a\)。注意到连续操作 \([i, i]\) 两次所形成的序列要么是 \(a\),要么是除了 \(a_i\) 都翻转的序列。我们可以多随几次,总能碰到第二种情况,然后就能知道第 \(i\) 个数是 \(0\) 还是 \(1\) 了,然后再还原回去。当然有一个问题就是除开 \(a_i\) 以外剩下的 \(01\) 数量相等,这里我们可以把 \([i, i]\) 改为 \([i, i + 1]\),这样每次能得到 \(a_i + a_{i + 1}\),最后再统计一下就可以了。这样我们就得到了一个期望 \(8n\) 次询问的做法。

其实放 \(10000\) 没有必要,完全可以开到 \(3000\),总不至于有人这么非吧

上一篇:定时器代码-


下一篇:整数二分、浮点数二分