結果

問題 No.850 企業コンテスト2位
ユーザー chocorusk
提出日時 2019-03-28 01:06:32
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
RE  
実行時間 -
コード長 1,566 bytes
コンパイル時間 887 ms
コンパイル使用メモリ 88,952 KB
実行使用メモリ 25,604 KB
平均クエリ数 200.93
最終ジャッジ日時 2024-07-16 16:49:00
合計ジャッジ時間 5,926 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 21 RE * 6
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<random>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
void ask(int x, int y){
    cout<<"? "<<x<<" "<<y<<endl;
}
int main(){
    int n; cin>>n;
    int ret;
    if(n<=168){
        int mx=1, mx2=2;
        ask(1, 2);
        cin>>ret;
        if(ret==2) swap(mx, mx2);
        for(int i=3; i<=n; i++){
            ask(i, mx2);
            cin>>ret;
            if(ret==mx2) continue;
            ask(i, mx);
            cin>>ret;
            if(ret==mx){
                mx2=i;
            }else{
                mx2=mx;
                mx=i;
            }
        }
        cout<<"! "<<mx2<<endl;
        return 0;
    }
    srand((unsigned) time(NULL));
    int d=24;
    int t=0;
    int v=-1;
    set<int> st;
    while(t<d){
        int r=rand()%n+1;
        if(st.find(r)!=st.end()) continue;
        st.insert(r);
        if(v==-1) v=r;
        else{
            ask(v, r);
            cin>>ret;
            v=ret;
        }
        t++;
    }
    vector<int> vec;
    for(int i=1; i<=n; i++){
        if(st.find(i)!=st.end()) continue;
        ask(v, i);
        cin>>ret;
        if(ret==i) vec.push_back(i);
    }
    int mx=v, mx2=vec[0];
    ask(mx, mx2); cin>>ret;
    if(ret==mx2) swap(mx, mx2);
    for(int i=1; i<vec.size(); i++){
        ask(mx2, vec[i]);
        cin>>ret;
        if(ret==mx2) continue;
        ask(mx, vec[i]);
        cin>>ret;
        if(ret==mx) mx2=vec[i];
        else{
            mx2=mx;
            mx=vec[i];
        }
    }
    cout<<"! "<<mx2<<endl;
    return 0;
}
0