[CF1698D]Fixed Point Guessing
做题时间:2022.6.29
这是一道交互题。评测机生成一个长度为 的序列 ,并交换 组互不相同的位置上的数字,最后有且仅有一个数字的位置不变,给出操作完的序列。你可以向评测机询问区间 中的数按升序排列后的结果,询问次数不超过 次,最后你要求出这个位置不变的数。
第一行一个整数 表示数据组数
每组数据第一行一个整数
第二行 个整数表示序列
二分
可以发现询问次数很少,且 和 很接近,可以考虑二分。
每次查找一个 ,想要判断位置不变的数是否在其中分几种情况讨论,如果 中的其中 个数与 之外的数进行了交换那么 大小 在 中的数的个数就减去了 ,而 内的数两两交换则不变。可以理解为,操作完成后,若 中的数全部被交换过,那么 大小 在 内的数要么被交换出去,要么成对留下。因此若 区间中大小在 中的数有奇数个,说明位置不变的数就在其中。
#include<iostream> #include<cstdio> #include<iomanip> using namespace std; const int N=1e4+50; int a[N],t,n; void Query(int x,int y) { int cnt=0; cout<<"? "<<x<<" "<<y<<endl; for(int i=1;i<=y-x+1;i++) cin>>a[i]; fflush(stdout); } int main() { cin>>t; while(t--){ cin>>n; int l=1,r=n; while(l<r){ int mid=(l+r)>>1; Query(l,mid); int cnt=0; for(int i=1;i<=mid-l+1;i++){ if(a[i]>=l&a[i]<=mid) cnt++; } if(cnt%2==0) l=mid+1; else r=mid; } cout<<"! "<<l<<endl; fflush(stdout); } return 0; }
本文作者:lxzy
本文链接:https://www.cnblogs.com/Unlimited-Chan/p/16456924.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步