CF1583D
题解
先求出
具体地,先从
特殊地,若
:::info[为什么这样求]
根据排列性质,如果
但是因为询问的数组必须满足所有元素在
这样处理之后,发现所有大于
类似地,对于一个数
:::info[为什么这样构造]
可以发现构造的数组
这样,就可以在
代码
#include<bits/stdc++.h>
using namespace std;
int n;
int p[105];
int main() {
scanf("%d",&n);
int pd=1;
p[n]=n+1;
while(pd) {
p[n]--;
if(p[n]==1) break;
printf("? ");
for(int i=1;i<n;i++) printf("1 ");
printf("%d\n",n-p[n]+2);
fflush(stdout);
scanf("%d",&pd);
p[pd]=n-p[n]+1;
}
for(int i=1;i<n;i++) if(p[i]) p[i]+=p[n];
pd=0;
for(int i=1;i<p[n];i++) {
printf("? ");
for(int j=1;j<n;j++) printf("%d ",p[n]-i+1);
puts("1");
fflush(stdout);
scanf("%d",&pd);
p[pd]=i;
}
printf("! ");
for(int i=1;i<=n;i++) printf("%d ",p[i]);
return 0;
}