Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2) D
题目链接
题意
给定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,排序后即得答案。

浙公网安备 33010602011771号