题目大意:

本题有两个隐藏起来的a b(1<=a,b<=1e30)

每次可 printf("? %d %d\n",c,d); 表示询问 a^c 与 b^d 的相对大小 最多可询问62次

然后 scanf("%d",&ans); 读入返回的答案

ans=1 说明 a^c > b^d

ans=0 说明 a^c = b^d

ans=-1 说明 a^c < b^d

当通过询问确定了a b就 printf("! %d %d\n",a,b); 表示得到答案为 a b

input

Copy
1
-1
0
output

Copy
? 2 1
? 1 2
? 2 0
! 3 1

询问 a^2 与 b^1 得到 1

询问 a^1 与 b^2 得到 -1

询问 a^2 与 b^0 得到 0

就可以确定隐藏的 a=3 b=1

代码里有详细注释

这里我们举个简单的栗子

一开始 a^0比较b^0 可得到a b的相对大小 此时假设a>b

a>b时则a b第i位有三种可能

取反最高位后再判断a b的相对大小

a   b

1   1   (a b都取反)-> 0  0   (再比较a b可得到a>b) -> 无法确定(1式)

1   0   (a b都取反)-> 0  1   (再比较a b可得到a<b) -> 可说明ai=1 bi=0

0   0   (a b都取反)-> 1  1   (再比较a b可得到a>b) -> 无法确定(2式)

(1式) (2式) 无法确定 继续询问

a   b

1   1   (a取反)-> 0  1   (再比较a b可得到a<b) -> 可说明ai=1 bi=1

0   0   (a取反)-> 1  0   (再比较a b可得到a>b) -> 可说明ai=0 bi=0

a=1101 b=1011(a>b)

取反a b第一位 a=0101 b=0011 询问可得a>b 无法判断

此时只取反a的第一位 a=0101 b=1011 询问可得a<b 说明a的第一位为1 b的第一位为1

第一位已确定 去掉第一位a=101 b=011(a>b)

那么取反此时a b第二位 a=001 b=111 询问可得a<b 说明a的第二位为1 b的第二位为0

第二位已确定 去掉第二位a=01 b=11(a<b)

那么取反此时a b第三位 a=11 b=01 询问可得a>b 说明a的第三位为0 b的第三位为1

第三位 已确定 去掉第三位 a=1 b=1(a<b)

那么取反此时a b第四位 a=0 b=0 询问可得a=b 无法判断

此时只取反a的第四位 a=0 b=1 询问可得a<b 说明a的第四位为1 b的第四位为1

最终得到a b

#include <bits/stdc++.h>
using namespace std;
int a, b;
int maybe(int c,int d) {
printf("? %d %d\n",c,d);
fflush(stdout);
int ans; scanf("%d",&ans);
return ans;
}
int main()
{
int f=,la=,lb=;
for(int i=;i>=;i--) {
// la lb为a b二进制第i位往左 包含第i位为lai lbi
// ra rb为a b二进制第i位往右 包含第i为为rai rbi
// ai bi为a b二进制第i位
if(f==) { // f=0时去判断rai rbi的相对大小
if(maybe(la,lb)==-) f=-; // rai<rbi
else f=; // rai>=rbi
}
if(f==) {
/* 已知 rai >= rbi
则a b第i位有三种可能
ai bi (将ai bi取反 la^(1<<i) lb^(1<<i))
1 1 -> 0 0 -> maybe(la,lb)=1或0 (1式)
1 0 -> 0 1 -> maybe(la,lb)=-1即rai<=rbi -> 可得到ai=1 bi=0 此时ra rb的相对大小则不确定了
0 0 -> 1 1 -> maybe(la,lb)=1或0 (2式)
(1式)=(2式) 无法确定
ai bi (只将ai取反 la^(1<<i) )
1 1 -> 0 1 -> maybe(la,lb)=-1即rai<=rbi -> 可得到ai=1 bi=1 此时ra rb的相对大小仍不变
0 0 -> 1 0 -> maybe(la,lb)=1或0即rai>=rbi-> 可得到ai=0 bi=0 此时ra rb的相对大小仍不变
将得到的结果更新到la lb 然后i继续往右判断 */
if(maybe(la^(<<i),lb^(<<i))==-)
la^=(<<i), f=; // 下轮i往右 需要判断rai rbi的相对大小
else if(maybe(la^(<<i),lb)==-)
la^=(<<i), lb^=(<<i);
} else {
/* f=-1同理f=1 相反过来判断 */
if(maybe(la^(<<i),lb^(<<i))!=-)
lb^=(<<i), f=; // 下轮i往右 需要判断rai rbi的相对大小
else if(maybe(la,lb^(<<i))==)
la^=(<<i), lb^=(<<i);
}
}
printf("! %d %d\n",la,lb);
fflush(stdout); return ;
}

Codeforces Round #525 D - Ehab and another another xor problem /// 构造的更多相关文章

  1. Codeforces Round #525 E - Ehab and a component choosing problem

    题目大意: 在一棵树中 选出k个联通块 使得 这k个联通块的点权总和 / k 最大 并且这k个联通块不相互覆盖(即一个点只能属于一个联通块) 如果有多种方案,找到k最大的那种 给定n 有n个点 给定n ...

  2. cf1088D Ehab and another another xor problem (构造)

    题意:有两数a,b,每次你可以给定c,d询问a xor c和b xor d的大小关系,最多询问62次($a,b<=2^{30}$),问a和b 考虑从高位往低位做,正在做第i位,已经知道了a和b的 ...

  3. 【CF1174D】 Ehab and the Expected XOR Problem - 构造

    题面 Given two integers \(n\) and \(x\), construct an array that satisfies the following conditions: · ...

  4. Codeforces Round #525 (Div. 2)D. Ehab and another another xor problem

    D. Ehab and another another xor problem 题目链接:https://codeforces.com/contest/1088/problem/D Descripti ...

  5. Codeforces Round #525 (Div. 2)

    Codeforces Round #525 (Div. 2) 哎,忍不住想吐槽一下,又要准备训练,又要做些无聊的事,弄得我都想退出了. 好好的训练不好么???? 只能做出两道水题,其实C题,感觉做出来 ...

  6. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  7. Codeforces Round #525 (Div. 2) Solution

    A. Ehab and another construction problem Water. #include <bits/stdc++.h> using namespace std; ...

  8. CodeForces Round 525

    A:Ehab and another construction problem #include<bits/stdc++.h> using namespace std; #define F ...

  9. Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题

    Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题 [Problem Description] ​ 总共两次询 ...

随机推荐

  1. (转)浅谈C中的malloc和free

    原帖及讨论:http://bbs.bccn.net/thread-82212-1-1.html 在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数 ...

  2. ASP.NET Core学习——5

    日志(Logging)ASP.NET Core内建支持日志,也允许开发人员轻松切换为他们想用的其他日志框架. 通过dependency-injection请求ILoggerFactory或ILogge ...

  3. Openstack组件部署 — Networking service_安装并配置Controller Node

    目录 目录 前文列表 前提条件 网络环境 完成下面的步骤以创建数据库 创建service credentials服务凭证 创建Neutron的API Endpoints 配置自服务网络 安装网络组件 ...

  4. 10 个轻松学会 CSS3 的优秀在线资源

    本文包揽 CSS 的所有关键点,并且引入了最新的 CSS3 版本.这个先进的技术提供超级多的新标签和属性,使得 Web 设计构建创新更简单,帮助开发者创建具有新趋势,带有漂亮布局的 Web 页面.随着 ...

  5. Apriori-关联规则挖掘算法

    Apriori算法采用的是自底向上的方法,从1-频繁集开始,逐步找出高阶频繁集. 它的基本流程是:第一次扫描交易数据库D时,产生1- 频繁集.在此基础上经过连接.修剪产生2-频繁集.以此类推,直到无法 ...

  6. 洛谷 P2652 同花顺(离散化)

    洛谷 P2652 同花顺(题面) 手动模拟了一下,其实离散化排序可以起很大作用题目要求花色相同,数字连续,那么我们要做的就是找一种花色,并提取出其中一串数字留下那些舍弃的牌换成相应花色,并和之前留下的 ...

  7. hdu6354 /// 圆的相交

    题目大意: 给定m r 初始圆盘以原点为圆心半径为r 给定m个圆的圆心(x,y) 半径r 保证m个圆互不相交且不会覆盖圆盘 用这m个圆来切割初始的圆盘求最后圆盘外围的长度 求圆与圆盘的交点 减去圆盘上 ...

  8. 代码控制PrivateBinPath和ConfigurationFile的位置

    原文:代码控制PrivateBinPath和ConfigurationFile的位置 .Net的WinForm程序有的时候让人很烦的是,在执行目录下总是一大堆的DLL,配置文件,最少则是个以下,多的时 ...

  9. 使用Kettle的命名参数动态执行作业

    关于如何根据传入的不同参数,达到动态运行作业的目的,这里不介绍.只提供一个思路,就是不同的调度进程调度同一个Kettle文件时,传入了不同的参数,从而得到不同的数据. 如下图所示: 1. 先设置参数名 ...

  10. Linux 守护进程创建

    1. 守护进程: 是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.守护进程常常在系统启动时开始运行,在系统关闭时终止 2. ...