[CF1364E] X-OR
X-OR
题面翻译
题目描述
本题是交互题。
有一个固定的长度为 \(n\) 的排列 \(P\),其值域为 \([0,n-1]\),你可以进行不超过 \(4269\) 次询问,之后你需要输出这个排列 \(P\)。
输入格式
第一行有一个正整数 \(n\),表示排列的长度。
保证 \(3\le n\le 2048\),\(0\le P_i\le n-1\)。
交互格式
你可以按照 ? a b 的格式进行询问,之后你会得到 \(P_a\) 与 \(P_b\) 的按位或。
当你需要输出 \(P\) 时,首先输出一个 !,之后输出 \(n\) 个整数 \(P_i\)。
题目描述
This is an interactive problem!
Ehab has a hidden permutation $ p $ of length $ n $ consisting of the elements from $ 0 $ to $ n-1 $ . You, for some reason, want to figure out the permutation. To do that, you can give Ehab $ 2 $ different indices $ i $ and $ j $ , and he'll reply with $ (p_i|p_j) $ where $ | $ is the bitwise-or operation.
Ehab has just enough free time to answer $ 4269 $ questions, and while he's OK with answering that many questions, he's too lazy to play your silly games, so he'll fix the permutation beforehand and will not change it depending on your queries. Can you guess the permutation?
输入格式
The only line contains the integer $ n $ $ (3 \le n \le 2048) $ — the length of the permutation.
输出格式
To ask a question, print "? $ i $ $ j $ " (without quotes, $ i \neq j $ ) Then, you should read the answer, which will be $ (p_i|p_j) $ .
If we answer with $ -1 $ instead of a valid answer, that means you exceeded the number of queries or made an invalid query.
Exit immediately after receiving $ -1 $ and you will see wrong answer verdict. Otherwise, you can get an arbitrary verdict because your solution will continue to read from a closed stream.
To print the answer, print "! $ p_1 $ $ p_2 $ $ \ldots $ $ p_n $ " (without quotes). Note that answering doesn't count as one of the $ 4269 $ queries.
After printing a query or printing the answer, do not forget to output end of line and flush the output. Otherwise, you will get idleness limit exceeded. To do this, use:
- fflush(stdout) or cout.flush() in C++;
- System.out.flush() in Java;
- flush(output) in Pascal;
- stdout.flush() in Python;
- See the documentation for other languages.
Hacks:
The first line should contain the integer $ n $ ( $ 3 \le n \le 2^{11} $ ) — the length of the permutation $ p $ .
The second line should contain $ n $ space-separated integers $ p_1 $ , $ p_2 $ , $ \ldots $ , $ p_n $ ( $ 0 \le p_i < n $ ) — the elements of the permutation $ p $ .
样例 #1
样例输入 #1
3
1
3
2
样例输出 #1
? 1 2
? 1 3
? 2 3
! 1 0 2
提示
In the first sample, the permutation is $ [1,0,2] $ . You start by asking about $ p_1|p_2 $ and Ehab replies with $ 1 $ . You then ask about $ p_1|p_3 $ and Ehab replies with $ 3 $ . Finally, you ask about $ p_2|p_3 $ and Ehab replies with $ 2 $ . You then guess the permutation.
只要找到 \(0\) 所在的位置,我们就可以轻松求出其他地方的值了。
关键在于如何快速找到 \(0\) 所在的位置。
先考虑如何快速求出某一位 \(i\) 的值。暴力的话枚举所有其他位置,询问 \(i,j\),然后所有得到的结果取个与就行了。
发现不用枚举所有位置,期望情况下,取 一次与,二进制下 1 的个数会除以2,只要随机 \(log logn\) 个位置询问取与就足够了。具体可以随机十个数。
求出某个数 \(p_i\),后,如果询问 \(p_i 或 p_j\ne p_i\),那么 \(j\) 不可能是 \(0\),否则求出 \(p_j\) 的答案。
发现询问时 \(p_i\) 二进制下 1 的个数会不断减少,所以只会询问 \(log\) 次可以得到 \(0\) 的位置,然后就好做了。总共询问次数 \(2n+lognlog logn\)
#include<bits/stdc++.h>
using namespace std;
const int N=3005;
mt19937 gen(time(0));
int n,p[N],lst,cnt,pt[N];
int ask(int x,int y)
{
printf("? %d %d\n",x,y);
fflush(stdout);
int a;
scanf("%d",&a);
return a;
// ++cnt;
// return pt[x]|pt[y];
}
void answer(int x)
{
// printf("%d\n",x);
for(int i=1;i<=n;i++)
if(x^i)
p[i]=ask(x,i);
p[x]=0;
putchar('!'),putchar(' ');
for(int i=1;i<=n;i++)
printf("%d ",p[i]);
fflush(stdout);
// for(int i=1;i<=n;i++)
// if(p[i]^pt[i])
// return puts("failed"),void();
// printf("succes %d",cnt);
}
int calc(int x)
{
int mn=32767;
for(int T=1;T<=10;T++)
{
int k=gen()%n+1;
if(k^x)
mn&=ask(x,k);
}
return mn;
}
int main()
{
scanf("%d",&n);
lst=1,p[1]=calc(1);
for(int i=2;i<=n;i++)
{
if(ask(i,lst)==p[lst])
{
p[i]=calc(i);
lst=i;
}
}
answer(lst);
}
随机推荐
- 我也来扒一扒python的内存回收机制!
python的内存回收是面试中经常会问到一个问题,今天我来给大家深度剖析下python的内存回收和缓存机制 1.引用计数器 我们知道,python是通过引用计数器来做内存回收的,下面我们来重点讲下引用 ...
- 4、Spring之依赖注入
依赖注入就是对类的属性进行赋值 4.1.环境搭建 创建名为spring_ioc_xml的新module,过程参考3.1节 4.1.1.创建spring配置文件 <?xml version=&qu ...
- 三维模型OSGB格式轻量化的数据压缩与性能平衡分析
三维模型OSGB格式轻量化的数据压缩与性能平衡分析 在三维模型应用中,OSGB格式轻量化处理是一种常见的技术手段,它可以通过数据压缩.简化.滤波等操作,降低三维模型数据的存储空间和传输带宽需求,提高应 ...
- ImGui界面优化:使用图标字体、隐藏主窗口标题栏
目录 使用图标字体 扩展:内存加载字体 隐藏主窗口标题栏 增加程序退出 改进HideTabBar 窗口最大化 总结 本文主要介绍ImGui应用中的一些界面优化方法,如果是第一次使用ImGui推荐从上一 ...
- T-SQL——关于数据合并(Merge)
目录 0. 背景说明及测试数据 1. 直接清空,重新插入 2. 单条记录执行插入.更新操作 3. Merge函数 3.1 准备测试数据 3.2 测试Merge 3.3 关于Merge 4.参考 sha ...
- 【RocketMQ】【源码】延迟消息实现原理
RocketMQ设定了延迟级别可以让消息延迟消费,延迟消息会使用SCHEDULE_TOPIC_XXXX这个主题,每个延迟等级对应一个消息队列,并且与普通消息一样,会保存每个消息队列的消费进度(dela ...
- SSMS 显示行号
SSMS 显示行号 SSMS2022--工具--选项--文本编辑器--所有语言--常规--勾选"行号"--确定.
- 熟练掌握并充分利用CSS3的新特性,更新完毕。
1.1 尝试新颖的CSS3特性 首先,我们来看一个具体的案例. https://code.juejin.cn/pen/7277536985772720139 1.2 CSS3新特性简介和浏览 ...
- VScodeSSH免密登录服务器
参考:配置vscode 远程开发+ 免密登录 背景 我想要让VScode实现SSH免密登录服务器,那么就需要使用ssh keygen 生成的公私钥对,公钥id_rsa.pub放在服务器上,私钥id_r ...
- MySQL8.0默认加密连接方式
Mysql8.0开始默认采用新的caching_sha2_password的身份验证方式,常规老接口会因此无法连接数据库. 为继续使用老的身份验证方式,需显式指定身份验证方式为 mysql_nativ ...