人生第一道交互题 & 非传统题qwq
Description
This is an interactive problem!
Ehab plays a game with Laggy. Ehab has 2 hidden integers (a,b), Laggy can ask a pair of integers (c, d) and Ehab will reply with:
- 1 if $a \oplus c>b \oplus d$
- 0 if $a \oplus c=b \oplus d$
- -1 if $a \oplus c<b \oplus d$
Operation $a \oplus b$ is the bitwise-xor operation of two numbers a and b
Laggy should guess $(a,b)$ with at most 62 questions. You’ll play this game. You’re Laggy and the interactor is Ehab.
It’s guaranteed that $0 \leq a,b<2^{30}$
Samples
Input #1
1 | 1 |
Output #1
1 | ? 2 1 |
Solution
考虑从高位到低位依次确定$a,b$的二进制组成, 假设当前已确定的二进制组成为$A, B$.
首先用一次询问$(0,0)$求出$a,b$的大小关系, 令其为$k$.
然后我们用这个$k$来维护当前$a \oplus A$和$b \oplus B$的大小关系.
对于每一位, 我们首先用一个询问$(A \oplus 2^i, B \oplus 2^i)$, 如果得到的大小关系等于$k$, 则说明这两个二进制位相等,不需要更新$k$ , 否则不等.
如果相等, 那么继续询问$(A \oplus 2^i, B)$, 如果结果为$1$, 说明两个数都不含第$i$位, 若为-1,则说明两数都含第$i$位, 然后更新$A,B$
如果不等, 得到的大小关系为1,则$a$含有第$i$位, 否则$b$含有之, 更新$A,B$
这时候$k$的值就可能发生改变, 所以应再用一个询问$(A,B)$来更新$k$的值.
Code
1 | /* Headers */ |