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. https://www.cnblogs.com/spec-dog/p/11161744.html

    转自:https://www.cnblogs.com/spec-dog/p/11161744.html 在软件项目研发管理过程中,是否经常出现这样的场景:开发人员不知道什么时候转测:项目经理拿个Exc ...

  2. C# 获得当前方法 和 方法调用链 的 方法

    一个获得方法名的方法,depth表示调用此方法的回溯深度. 比如,A方法调用B方法,B方法调用GetCurrentMethodFullName(2),那么得到的结果是A方法的全名(namespace+ ...

  3. 1.26学习总结——css盒子模型

    CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封装周围的H ...

  4. 使用git克隆仓库到本地报错:SSL certificate problem: unable to get local issuer certificate

    第一次使用Git工具克隆仓库,使用的是HTTPS链接,失败了.发现是因为通过HTTPS访问时,如果服务器上的SSL证书未经过第三方机构认证,Git就会报错. 解决方法:通过命令关闭验证 git con ...

  5. 【PHP数据结构】栈的相关逻辑操作

    对于逻辑结构来说,我们也是从最简单的开始.堆栈.队列,这两个词对于大部分人都不会陌生,但是,堆和栈其实是两个东西.在面试的时候千万不要被面试官绕晕了.堆是一种树结构,或者说是完全二叉树的结构.而今天, ...

  6. PHP中的MySQLi扩展学习(三)mysqli的基本操作

    我们继续 MySQLi 扩展的学习,上篇文章中提到过,MySQLi 的扩展相对于 PDO 来说功能更加的丰富,所以我们依然还会在学习过程中穿插各种 MySQLi 中好玩的方法函数.不过,今天的主角是 ...

  7. PHP中操作数据库的预处理语句

    今天这篇文章的内容其实也是非常基础的内容,不过在现代化的开发中,大家都使用框架,已经很少人会去自己封装或者经常写底层的数据库操作代码了.所以这回我们就来复习一下数据库中相关扩展中的预处理语句内容. 什 ...

  8. vue跳转路由

    1.  router-link 1. 不带参数 <router-link :to="{name:'home'}"> <router-link :to=" ...

  9. Java基础系列(20)- while循环

    循环结构 while循环 do-循环 for循环 在java5中引入了一种主要用于数组的增强型for循环 while循环 while是最基本的循环,它的结构为 while(布尔表达式){ //循环内容 ...

  10. Linux系列(1) - 使用Hyper-V安装Linux系统

    前言 使用工具:Hyper-V,补充:hyper-v是一项技术,而vmware是一款软件.具体区别自行百度 LINUX版本:CentOS-8.4.2105-x86_64-dvd1.iso Window ...