2020-2021:teams:farmer_john:jjleo:codeforces_round_649_div._2_virtual_participation
rank:38
(竟然AK了,虽然是VP)
A
B
C
题意:给出序列$a_i$,保证$a_i \le a_{i+1}$,要求构造一个序列$b_i$,使得$MEX(a_1,a_2,\ldots,a_i)=b_i$,要求$0 \le b_i \le 10^6$;或判断无解。
D
E
题解:我们只要获得$0$的位置就可以通过$n-1$次询问获得剩下每个位置的数,因此我们要在$2222$次获取到$0$的位置。首先我们有两个比较显然的引理:1.如果$a|b>a|c$,那么$b \ne 0$;2.如果$b \ne c, a|b=a|c$,那么$a \ne 0$。因此我们可以从第一个位置开始,假设某个位置对应的值$a$是$0$,然后依次询问它和后面每个值的$OR$,同时维护$a|b$最小值所在的位置。如果没有出现相等的值,那么我们每次可以排除一个不是$0$的值;如果出现相等的值,那么原本那个位置就不是$0$,只有可能$a|b$最小值所在的位置是最小值,因此以这个位置为$a$继续往下扫即可。然而这里其实有一个问题,就是如果这个最小值是重复的值,那么有$2$个位置都有可能,因此我们要选一个位置然后额外询问一次这两个位置,这会造成一次额外询问,因此如果不随机访问是可能会被卡的。(然而我忘记随机访问但还是a了,可能数据就是随机的,当然这也证明了随机的情况下额外询问的次数是很小的)最后我们会剩下一个假设是$0$的位置以及后面位置中$a|b$最小值所在的位置,只有这两个位置可能是$0$,那么它们两个的$OR$值就是其中不为$0$的那个值,设为$x$。我们先假设其中一个位置的值是$x$,然后用剩下的次数去随机访问其它位置和这个位置的$OR$,如果返回的答案$y$不完全包含$x$的所有二进制位,那么说明这个位置是$0$,否则这个位置就是$x$而另一个位置是$0$。事实证明剩下的次数还是比较多的,可以让这种做法的错误率降到很低。
2020-2021/teams/farmer_john/jjleo/codeforces_round_649_div._2_virtual_participation.txt · 最后更改: 2020/06/19 23:40 由 jjleo