CF2031F - Penchick and Even Medians
题面
-
对于位置
,如果询问除了这两个位置以外的所有位置,如果答案为 ,则说明 这两个位置上的元素一个小于 ,一个大于 。 -
我们通过随机化选取
以满足这两个位置上的元素一个小于 ,一个大于 。 -
考虑另外的两个位置
,如果询问 的答案其中一个为 ,那么 中必有一个位置上的元素为 ,如果询问 的答案其中一个为 ,那么 中必有一个位置上的元素为 。 -
记录答案等于
或 的两组 ,令为 。 -
最后只需对
两两组合与 一起询问,如果答案为 和 ,就输出这两个 。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
mt19937 rnd(time(0));
void sol(){
cin>>n;
ll p1=0,p2=0;
while(1){
ll x,y;
x=rnd()%n+1,y=rnd()%n+1;
while(y==x)y=rnd()%n+1;
cout<<"? "<<n-2<<" ";
for(int j=1;j<=n;j++){
if(j!=x&&j!=y)cout<<j<<" ";
}
cout<<endl;
ll ax,ay;
cin>>ax>>ay;
if(ax==n/2&&ay==n/2+1){
p1=x,p2=y;
break;
}
}
ll x=0,y=0,p3,p4,p5,p6;
while(y<=n){
x++;
while(x==p1||x==p2)x++;
y=x+1;
while(y==p1||y==p2)y++;
if(y<=n){
cout<<"? "<<4<<" "<<p1<<" "<<p2<<" "<<x<<" "<<y<<endl;
ll ax,ay;
cin>>ax>>ay;
if(ax==n/2||ay==n/2)p3=x,p4=y;
if(ax==n/2+1||ay==n/2+1)p5=x,p6=y;
}
x=y;
}
ll ax,ay;
cout<<"? "<<4<<" "<<p1<<" "<<p2<<" "<<p3<<" "<<p4<<endl;
cin>>ax>>ay;
if(ax==n/2&&ay==n/2+1){
cout<<"! "<<p3<<" "<<p4<<endl;
return;
}
cout<<"? "<<4<<" "<<p1<<" "<<p2<<" "<<p3<<" "<<p5<<endl;
cin>>ax>>ay;
if(ax==n/2&&ay==n/2+1){
cout<<"! "<<p3<<" "<<p5<<endl;
return;
}
cout<<"? "<<4<<" "<<p1<<" "<<p2<<" "<<p3<<" "<<p6<<endl;
cin>>ax>>ay;
if(ax==n/2&&ay==n/2+1){
cout<<"! "<<p3<<" "<<p6<<endl;
return;
}
cout<<"? "<<4<<" "<<p1<<" "<<p2<<" "<<p4<<" "<<p5<<endl;
cin>>ax>>ay;
if(ax==n/2&&ay==n/2+1){
cout<<"! "<<p4<<" "<<p5<<endl;
return;
}
cout<<"? "<<4<<" "<<p1<<" "<<p2<<" "<<p4<<" "<<p6<<endl;
cin>>ax>>ay;
if(ax==n/2&&ay==n/2+1){
cout<<"! "<<p4<<" "<<p6<<endl;
return;
}
cout<<"? "<<4<<" "<<p1<<" "<<p2<<" "<<p5<<" "<<p6<<endl;
cin>>ax>>ay;
if(ax==n/2&&ay==n/2+1){
cout<<"! "<<p5<<" "<<p6<<endl;
return;
}
}
int main(){
int T;
cin>>T;
while(T--)sol();
}
本文作者:xzhiflow
本文链接:https://www.cnblogs.com/Exotic-sum/p/18719326
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步