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);
}

随机推荐

  1. 原生CSS嵌套简介

    嵌套是使用Sass等CSS预处理器的核心原因之一.现在,该功能已经以类似的语法出现在标准浏览器CSS中.你能否在构建系统时放弃对预处理器的依赖? CSS嵌套可以节省输入时间,并使语法更易于阅读和维护. ...

  2. Linux第四章(80X86保护模式及其编程)

    80X86保护模式及其编程 80X86基础知识 保护模式内存管理 各种保护措施 中断和异常处理 任务管理 保护模式编程的初始化 一个简单的多任务内核 4.1 80X86系统寄存器和系统指令 为了协助处 ...

  3. 2、搭建MyBatis

    2.1.开发环境 IDE:idea 2019.2 构建工具:maven 3.8.4 MySQL版本:MySQL 5.7 MyBatis版本:MyBatis 3.5.7 MySQL不同版本的注意事项 ( ...

  4. 企业级低代码平台,通用代码生成平台,Java开源项目(附源码)

    项目介绍 Jeecg-Boot 是一款基于代码生成器的智能开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design.强大的代码生成器 ...

  5. Storm整合Kafka Java API源码

    1.Maven项目的pom.xml源码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...

  6. 浅聊一下SpringMVC的核心组件以及通过源码了解其执行流程

    浅聊一下SpringMVC的核心组件以及通过源码了解其执行流程 MVC作为WEB项目开发的核心环节,正如三个单词的分解那样,Controller(控制器)将View(视图.用户客户端)与Model(j ...

  7. 用OLED屏幕播放视频(2): 为OLED屏幕开发I2C驱动

    下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这是此系列文章的第2篇, 主要总结和记录一个I ...

  8. 使用C#发送邮件支持 Implicit SSL

    安装Package: Install-Package AIM 使用下面的代码发送: class Mail { private static string mailAddress = "{yo ...

  9. 起风了,NCC 云原生项目孵化计划

    时间回到 2016 年,彼时 .NET Core 1.0 刚刚发布 1.0 版本,我跟几位好友共同发起 .NET Core 中文学习组(.NET Core China Studying Group)和 ...

  10. 手把手教你写一个JSON在线解析的前端网站1

    前言 作为一名Android开发,经常要跟后端同事联调接口,那么总避免不了要格式化接口返回值,将其转换为清晰直观高亮的UI样式以及折叠部分内容,方便我们查看定位关键的信息. 一直以来都是打开Googl ...