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;
}

posted @ 2020-07-12 16:10  winechord  阅读(245)  评论(0编辑  收藏  举报