Codeforces Round #525 (Div. 2) E

题意

告诉 a b c d a \oplus b和 c \oplus d 的大小关系。
b b d d 由自己给出,求 a a c c

题解

从高位到低位判断,显然起码要 2 2 个,还得维护后面的大小关系。
如果选择 1 1 , 0 0 ; 0 0 , 1 1
刚好在 0 0 0、0 1 1 1、1 的时候,可以直接确定,并且由于是相等的,大小关系不变。
0 1 0、1 1 0 1、0 的时候,不能直接确定,通过之前的大小关系确定之后,由于这一位的异或值相等,所以直接保存大小关系即是后面的大小关系。

#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
#define inf 1e18
using namespace std;
typedef long long ll;
const int maxn = 405000;

int n,A[maxn];

int query(int x,int y){
    cout<<"? "<<x<<" "<<y<<endl;
    cout.flush();
    int val;cin>>val;
    return val;
}

int main(){
    int a=0,b=0,big=query(a,b);
    for(int i=29;i>=0;i--){
        int l=query(a^(1<<i),b),r=query(a,b^(1<<i));
        if(l==r){
            if(big==1)a^=(1<<i);
            else if(big==-1)b^=(1<<i);
            big=l;
        }
        else if(l==-1){
            a^=(1<<i);
            b^=(1<<i);
        }
    }
    cout<<"!"<<" "<<a<<" "<<b<<endl;
}

发布了203 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/mxYlulu/article/details/104221466