結果
| 問題 |
No.850 企業コンテスト2位
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2019-03-27 21:40:47 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,554 bytes |
| コンパイル時間 | 870 ms |
| コンパイル使用メモリ | 90,748 KB |
| 実行使用メモリ | 25,604 KB |
| 平均クエリ数 | 204.07 |
| 最終ジャッジ日時 | 2024-07-16 16:48:53 |
| 合計ジャッジ時間 | 5,748 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 WA * 1 RE * 5 |
ソースコード
#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;
}
int d=(int)sqrt((double)(2*n));
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;
}
chocorusk