正题

题目链接:https://www.luogu.com.cn/problem/CF835E


题目大意

长度为\(n\)的序列中有两个\(y\)其他都是\(x\),给出\(n,x,y\)。你每次可以询问一个下标集合的数字异或和,要求在\(19\)次以内找到这两个\(y\)的位置。

\(1\leq n\leq 1000,1\leq x,y\leq 10^9,x\neq y\)


解题思路

考虑询问一个集合我们会得到的答案情况,如果集合大小为奇数则为\(y\)或者\(x\)依次表示\(y\)分别在一个集合内或者都在某个集合中,而偶数则是\(x\ xor\ y\)或者\(0\)。

现在变为了我们可以询问一个集合回答两个\(y\)都在一个集合内或外或者一个在内一个在外。

考虑到两个数字的下标肯定有一个二进制位不同,我们可以枚举这个位然后询问这个位是\(1\)的元素。这样我们总能找到一个集合使得一个\(y\)在内,一个\(y\)在外。

如果在这个两个集合里面暴力问的话算上前面的次数大概是\(3\log n\)的,考虑优化。

发现对于前面的询问,我们可以得到两个集合下标的异或值,所以如果我们问出一个位置再异或出另一个就好了。

因为是\(19\)次所以我们考虑找比较小的那个集合的值就好了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1100;
int n,x,y,cnt,p[N],ansa,ansb;
void Ask(int l,int r){
if(l==r){ansa=p[l];return;}
int mid=(l+r)>>1,ans,flag=0;
printf("? %d",mid-l+1);
for(int i=l;i<=mid;i++)
printf(" %d",p[i]);
putchar('\n');fflush(stdout);
scanf("%d",&ans);
if((mid-l+1)&1)flag=(ans==y);
else flag=(ans==(x^y));
if(flag)Ask(l,mid);
else Ask(mid+1,r);
return;
}
void Find(int z){
cnt=0;
for(int i=1;i<=n;i++)
if((i/z)&1)p[++cnt]=i;
if(cnt>(n/2)){
cnt=0;
for(int i=1;i<=n;i++)
if(!((i/z)&1))p[++cnt]=i;
}
Ask(1,cnt);
}
int main()
{
scanf("%d%d%d",&n,&x,&y);
bool has=0;
for(int z=1;z<=n;z<<=1){
int L=0,ans,flag=0;putchar('?');
for(int i=1;i<=n;i++)if((i/z)&1)L++;
printf(" %d",L);
for(int i=1;i<=n;i++)if((i/z)&1)printf(" %d",i);
putchar('\n');fflush(stdout);
scanf("%d",&ans);
if(L&1)flag=(ans==y);
else flag=(ans==(x^y));
if(flag&&!has)Find(z),has=1;
ansb^=z*flag;
}
ansb^=ansa;
if(ansa>ansb)swap(ansa,ansb);
printf("! %d %d\n",ansa,ansb);
fflush(stdout);
return 0;
}

CF835E-The penguin‘s game【交互】的更多相关文章

  1. Codeforces.835E.The penguin's game(交互 按位统计 二分)

    题目链接 \(Description\) 有一个长为\(n\)的序列,其中有两个元素为\(y\),其余全为\(x\).你可以进行\(19\)次询问,每次询问你给出一个下标集合,交互库会返回这些元素的异 ...

  2. Codeforces Round #427 (Div. 2) E. The penguin's game (交互题,二进制分组)

    E. The penguin's game time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...

  3. Sublime Text3配置在可交互环境下运行python快捷键

    安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...

  4. JS与APP原生控件交互

    "热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...

  5. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  6. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  7. EventBus实现activity跟fragment交互数据

    最近老是听到技术群里面有人提出需求,activity跟fragment交互数据,或者从一个activity跳转到另外一个activity的fragment,所以我给大家介绍一个开源项目,EventBu ...

  8. QT5利用chromium内核与HTML页面交互

    在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...

  9. PHP-----文件系统的交互

    本文讲解php中于文件交互中所使用的函数 代码示例 <html> <head> <title> File Detail </title> </he ...

随机推荐

  1. 数据结构解析-HashMap

    概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,改为了由 数组+链表+红黑树实现,主要的目的是提高查找效率. 如图所示: JDK版本 ...

  2. mybatis学习日志二

    一.动态sql语句 if语句 if+where语句 if+set语句 choose(when,otherwise)语句 trim语句 sql片段 foreach语句 总结 bean部分的User类代码 ...

  3. Java环境变量(Env)和系统属性(Property)详解

    环境变量Env 使用System.getenv()获取系统的所有环境变量的Map,注意它是一个UnmodifiableCollection,是一个只读视图 环境变量并不提供set方法,即没有Syste ...

  4. -e $request_filename + nginx内置变量

    -e表示只要filename存在,则为真,不管filename是什么类型,当然这里加了!就取反额外的一些-e filename 如果 filename存在,则为真-d filename 如果 file ...

  5. 刷题-力扣-213. 打家劫舍 II

    213. 打家劫舍 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-ii/ 著作权归领扣网络所有.商业 ...

  6. linux使用xampp安装MediaWiki环境

    1.下载并安装xampp 下载xampp 在下载页面下载. 放置到相应目录 将xampp-linux-x64-5.6.3-0-installer.run文件复制到部署机器的/root目录下 安装 [r ...

  7. redis rpoplpush列表转移元素

    文档出处:redisdoc.com/list/rpoplpush.html模式: 安全的队列 Redis的列表经常被用作队列(queue),用于在不同程序之间有序地交换消息(message).一个客户 ...

  8. Hadoop day1

    Hadoop就是存储海量数据和分析海量数据的工具 1.概念 Hadoop是由java语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架,其核心部件是HDFS与MapReduce ...

  9. lsyncd替代inotify+rsync实现实时同步

    因公司业务需要需要实时同步日志文件,刚一开始使用的是inotify+rsync来实现实时同步,但时间久而久之发现同步的速度越来越慢,往往延迟好几个小时.查了一下网上的inotify+rsync方案基本 ...

  10. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(1):二阶与三阶行列式、全排列及其逆序数

    @ 目录 前言 二阶与三阶行列式 二阶行列式 三阶行列式 全排列及其逆序数 全排列 逆序数 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ...