CF 1372F - Omkar and Modes (交互题)
这是一道交互题,每次给一个询问 ? l r
,返回的是该区间的众数以及其出现的次数 x,f
,思路是采用递归,由于要探求的数组是单调不降的,因此可以保证 [r+1-f,l-1+f]
区间内必定是 x
。
#include<iostream>
#include<cstdio>
#include<utility>
#include<tuple> // tie
#define MAXN 200010
using namespace std;
typedef pair<int,int> pii;
int a[MAXN],n;
pii ask(int l,int r){
cout << "? " << l << " " << r << endl;
int x;scanf("%d",&x);
if(x==-1)exit(0);
int f;scanf("%d",&f);
return {x,f};
}
void solve(int l,int r){
if(l>r)return ;
int x,f;
tie(x,f)=ask(l,r);
int l1=r+1-f,r1=l-1+f;
if(l1<=r1){
for(int i=l1;i<=r1;i++)a[i]=x;
solve(l,l1-1);solve(r1+1,r);
}else{
int m=(l+r)/2;
solve(l,m);solve(m+1,r);
}
}
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf("%d",&n);
solve(1,n);
printf("! ");
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}