题解:CF1088D Ehab and another another xor problem

· · 题解

题目传送门

思路

简单交互题。

首先确定 ab 的大小关系。询问 (0,0) 即可。

由于题目要求 62 次,而 a,b 至于为 2^{30},所以对于其每一位可询问 2 次,加上一开始判断大小和输出答案的 2 次,共 62 次。卡的非常死。

我们对于每个二进制位做两次询问来判断 ab 有没有这一位。通过返回结果来判断。考虑分类讨论即可。

代码

我通常不给代码。

#include<bits/stdc++.h>
using namespace std;
#define f fflush(stdout)
void ask(int x,int y){printf("? %d %d\n",x,y);f;}
void answer(int x,int y){printf("! %d %d\n",x,y);f;}
signed main(){
    ask(0,0);
    int op,ansa=0,ansb=0;scanf("%d",&op);
    for(int i=29;i>=0;i--){
        int k=(1<<i),x,y;
        ask(ansa^k,ansb);scanf("%d",&x);
        ask(ansa,ansb^k);scanf("%d",&y);
        if(x==y){
            if(op==1) ansa^=k;
            else if(op==-1) ansb^=k;
            op=x;
        }
        else if(x==-1) ansa^=k,ansb^=k;
    }answer(ansa,ansb);
    return 0;
}

撒花!