apio 练习赛 t3
题意
有 \(N\) 个化学药品,其中有 \([1,K]\) 个药品内有杂质。
你可以进行 \(M\) 次操作,第 \(i\) 次你可以放进去一些化学药品,然后机器会返回这里面是否有药品中有杂质。
你的操作序列必须是固定的。并且你在固定策略后,有 \(T\) 组测试,每组测试会告诉每次操作的结果,你都要返回哪些药品中有杂质。
sub1 : \(N=10^5,K=1,M=20\)。
sub2 : \(N=10^3,K=2,M=48\)。
sub3 : \(N=2.8 \times 10^4,K=4,M=170\)。
题解
考虑每个化学药品在哪些操作中使用了,就可以把问题看作是给每个药品标一个小于 \(2^M\) 的标号,返回的则是有杂质药品的标号或的值。
这样,\(K=1\) 就可以直接做了。
\(K=2\) 和 \(K=4\) 可以考虑随机化。
\(K=2\) 每一位以 \(\frac{1}{4}\) 左右的概率取 \(1\) 比较合适。\(K=4\) 则 \(\frac{1}{7}\) 左右比较合适
\(K=2\) 由于你可以 \(n^2\) 暴力 check,所以可以 \(i\) 从前往后依次确定标号 \(a_i\),每次随机后判断是否可行,如果 \(a_i | a_j\) 和之前的重复了就再随一个 \(a_i\)。这样可以做到更优一点,大概 \(30 \sim 35\) 次询问。
\(K=4\) 的时候,如果答案的某一位是 \(0\),就可以判断一些位置必然没有杂质。
这样我可以把有杂质的药品确定在一个集合内了。
然后再在集合内暴力找到最小可能的答案(也就是说,这些药品的或的值恰好为给定的值)就行了,可以做到 \(110\sim 120\) 次询问。这些东西都是可以使用 bitset 的。