CF1451E2 Bitwise Queries (Hard Version)

题意:

有 \(n\) 个数( \(n\le 2^{16}\) ,且为 \(2\) 的整数次幂,且每一个数都属于区间 \([0,n-1]\) ) 可以通过询问交互库不超过 \(n+1\) 次询问,每次询问编号为 \(i,j\) ( \(1\le i,j \le n\) ,\(i\ne j\) ) 的 XORORAND ,求出这 \(n\) 个数 。

题解:

分类讨论,先对 \(2-n\) 这 \(n-1\) 个数每个数都与 \(1\) 询问一次 XOR ,之后考虑 \(2\) 次求出 \(a_1\) 。

  • 所有数都互不相同

    此时所有 \(xor\) 值都不相同且都不等于 \(0\) ,可以分别找出 \(xor_i=1\) 与 \(xor_j=n-2\) 的数,用 \(1\) 一次 \(and\) 询问求出 \(a_1\) 的前 \(m\) 位与最后一位 。

  • 有些数相同

    那些数的 \(xor\) 值相同 。

    • 有些数与 \(a_1\) 相同

      找出 \(xor_i=0\) 的数,与 \(1\) 询问 AND ,直接求出 \(a_1\) 。

    • 有些数相同,但不等于 \(a_1\)

      找出两个 \(xor\) 相同的数,用 \(1\) 次询问求出 \(a_i\) ,进而用之前询问求得的 \(xor_i\) 求出 \(a_1\) 。

代码:

#include<bits/stdc++.h>
using namespace std;
#define Maxn 65540
inline int rd()
{
int x=0;
char ch,t=0;
while(!isdigit(ch = getchar())) t|=ch=='-';
while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
return x=t?-x:x;
}
int n,Xor[Maxn],ans[Maxn],vis[Maxn];
bool All=true;
inline int XOR(int x,int y)
{
printf("XOR %d %d\n",x,y),fflush(stdout);
return rd();
}
inline int AND(int x,int y)
{
printf("AND %d %d\n",x,y),fflush(stdout);
return rd();
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=rd();
for(int i=2;i<=n;i++)
{
Xor[i]=XOR(1,i);
if(vis[Xor[i]] || Xor[i]==0) All=0;
vis[Xor[i]]=1;
}
if(All)
{
for(int i=2;i<=n;i++)
{
if(Xor[i]==1) ans[1]|=AND(1,i);
if(Xor[i]==n-2) ans[1]|=AND(1,i);
}
}
else
{
if(vis[0])
{
for(int i=2;i<=n;i++) if(!Xor[i]) { ans[1]=AND(1,i); break; }
}
else
{
for(int i=0;i<=n-1;i++) vis[i]=0;
for(int i=2;i<=n;i++)
{
if(vis[Xor[i]]) { ans[1]=Xor[i]^AND(vis[Xor[i]],i); break; }
vis[Xor[i]]=i;
}
}
}
for(int i=2;i<=n;i++) ans[i]=ans[1]^Xor[i];
printf("! ");
for(int i=1;i<=n;i++) printf("%d%c",ans[i],(i==n)?'\n':' ');
fflush(stdout);
//fclose(stdin);
//fclose(stdout);
return 0;
}

【做题记录】CF1451E2 Bitwise Queries (Hard Version)的更多相关文章

  1. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  2. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

  3. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  4. 退役IV次后做题记录

    退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...

  5. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  6. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  7. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  8. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  9. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

随机推荐

  1. 本地Markdown文件上传到博客

    本地Markdown文件上传到博客 参考:https://www.cnblogs.com/ccylhw/p/13954153.html 1.Typora 最漂亮的写作APPhttps://www.ty ...

  2. DFS与DFS迷宫问题

    一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路. 输入格式 第一行输入两个整数n 和 ...

  3. node 在centos 6.5 上 安装过程中出现/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found问题的解决

    node  在centos 6.5 上 安装过程中出现/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found问题的解决 在linux ...

  4. fillder 抓包工具详解

    一.安装详解 直接点击.exe可执行文件,一直下一步直到安装完成即可.打开主要为5个部分: 二.安装jmeter插件详解 三.工具详解 3.1:工具条:,可以给指定的请求添加备注信息,在导出后可以查看 ...

  5. 『Python』进程同步

    1. Lock(互斥锁) 是可用的最低级的同步指令.Lock处于锁定状态时,不被其他的线程拥有. from multiprocessing import Process, Value, Lock de ...

  6. 防刷功能的实现(thinkphp5)

    $seconds = '3'; //时间段[秒] $refresh = '3';//最大次数 $cur_time = time(); if(Session::get('refresh_times')) ...

  7. YbtOJ#643-机器决斗【贪心,李超树】

    正题 题目链接:https://www.ybtoj.com.cn/problem/643 题目大意 \(n\)个机器人,第\(i\)个攻击力为\(A_i\),防御为\(D_i\). 然后你每次可以对一 ...

  8. NOIP 模拟 六十八

    咕了十几场了,还是写一写吧.. T1 玩水 发现满足三个人路径不同必须要有2个及以上的斜线相同结构,需要注意如果同一行或者同一列的话必须要相邻才行. #include<bits/stdc++.h ...

  9. 数据库的高可用MHA实验步骤

    一.多机互信的步骤 双机互信的步骤 第一步:在master管理服务器上ssh-keygen 在master同一台管理服务器上重新开一个窗口ssh-copy-id 192.168.0.13自己给自己互信 ...

  10. python自定义翻页配置

    1.创建pager.py文件,针对翻页进行函数书写 class PageInfo(object): # current_page 当前页数 # all_count 所有行 # per_page 每页的 ...