C. Chocolate Bunny
原题链接:Problem - 1407C - Codeforces
题目大意:
交互题目,要求通过2*n次以内的询问,猜出全排列。每次询问你给出i,j。他会返回pi mod pj
题目做法:
不难发现通过pi mod pj和pj mod pi,因为pi和pj当中肯定有个较大值,较小值mod较大值出来的是较小值,较大值mod较小值出来的是比较小值还小的值,所以一对必然可以确认一个。
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
using namespace std;
const int maxn=1e5+100;
void solve()
{
int n,inips=1;
cin>>n;
set<int> ps;
set<int> num;
int res[n+10];
for(int i=1;i<=n;i++) ps.insert(i),num.insert(i),res[i]=0;
while(ps.size()!=1)
{
auto i=*ps.begin(),j=*ps.rbegin();
int t1,t2;
cout<<"?"<<" "<<i<<" "<<j<<'\n';
cout.flush();
cin>>t1;
cout<<"?"<<" "<<j<<" "<<i<<'\n';
cout.flush();
cin>>t2;
if(t1>t2)
{
res[i]=t1;
ps.erase(ps.begin());
num.erase(t1);
}
else
{
res[j]=t2;
ps.erase((--ps.end()));
num.erase(t2);
}
}
cout<<"! ";
for(int i=1;i<=n;i++)
{
if(res[i]!=0) cout<<res[i]<<" ";
else cout<<*num.begin()<<" ";
}
}
signed main()
{
fast int casen=1;
//cin>>casen;
while(casen--) solve();
}