Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2) D

题目链接

Problem - D - Codeforces

题意

给定n和k,有n个隐藏着的数,询问不超过2*n个问题以找出其中第k小的数

问题的形式1:and i j (i!=j) 回答为第i个数和第j个数的and值

问题的形式2:or i j (i!=j) 回答为第i个数和第j个数的or值

 

结论

a&b+a|b=a+b

证明

先将a和b写成二进制形式

1° a和b某一位上不同

a|b=1,a&b=0。a+b在这一位上实际值也是1

2° a和b某一位上相同且都是0

a|b=0,a&b=0。a+b在这一位上实际值也是0

3°a和b某一位上相同且都是1

a|b=1,a&b=1。a+b在这一位上实际表现为进一位

 

a1=(a1&a2+a1|a2+a1&a3+a1|a3-a2&a3-a2|a3)/2;

a2=a1&a2+a1|a2-a1;

a3=a1&a3+a1|a3-a1;

for(int i=3;i<n;i++){ //ai ai+1
  ai+1=ai&ai+1+ai|ai+1-ai;
}

由此可在2*n个问题中得到所有的a,排序后即得答案。

posted @ 2021-08-30 10:00  starlightlmy  阅读(77)  评论(0)    收藏  举报