题意:
交互题~
输入一个n,代表一个1-n的全排列
最多2*n次询问,每次询问: ? a b,系统会返回第a个位置的数mod第b个位置的数的结果。
(既P_a %P_b )
问:这个排列是什么???
题解:
对于一对位置,我们做两次询问: ? a b , 然后询问 ? b a,那么我们就可以得到P_a和P_b中较小的数,每两次操作就可以得到一个数,但是只有这个操作,得不到排列中最大的那个数,所以我们的有效操作次数和必要操作次数其实是2*(n-1),最后一个数必然是n。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int ans[maxn];
int main()
{
int n;
cin >> n;
memset(ans,0,sizeof(ans));
int f = 1,a,b;
for(int i=2;i<=n;i++) {
cout<<"? "<<f<<' '<<i<<'\n';
cin >> a;
cout<<"? "<<i<<' '<<f<<'\n';
cin >> b;
if(a > b) {
ans[f] = a;
f = i;
} else {
ans[i] = b;
}
}
cout<<"! ";
for(int i=1;i<=n;i++)
{
if(ans[i] == 0)printf("%d ",n);
else printf("%d ",ans[i]);
}
}