题目链接,提交链接
是不是交互写挂了?
#include<bits/stdc++.h>
using namespace std;
const int N=3001;
int fa[N],T[N][2];
int n,dep[N],sz[N];
int read() {
int x=0; char c=0; while (!isdigit(c) ) c=getchar();
while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
return x;
}
int query(int x,int y) {
printf("? %d %d\n",x,y);
fflush(stdout); return read();
}
struct node
{
int id;
bool operator <(node o)const {
return dep[id]<dep[o.id];
}
}a[N];
void dfs(int x)
{
sz[x]=1;
if (T[x][0]) dfs(T[x][0]),sz[x]+=sz[T[x][0] ];
if (T[x][1]) dfs(T[x][1]),sz[x]+=sz[T[x][1] ];
if (sz[T[x][0] ]<sz[T[x][1] ]) swap(T[x][0],T[x][1]);
}
int main()
{
n=read();
for (int i=2;i<=n;i++)
dep[i]=query(1,i),a[i].id=i;
sort(a+2,a+n+1);
for (int i=2;i<=n;i++)
{
int x=a[i].id,p=1;
if (dep[x]==1) {
fa[x]=1; if (!T[1][0]) T[1][0]=x;
else T[1][1]=x; continue;
}
dfs(1);
while (true) {
if (!T[p][0]) { fa[x]=p,T[p][0]=x; break; }
while (T[p][0]) p=T[p][0];
int d=dep[p]-(dep[p]+dep[x]-query(p,x) )/2;
while (d--) p=fa[p]; if (!T[p][1]) { fa[x]=p,T[p][1]=x; break; }
p=T[p][1];
}
}
putchar('!');
for (int i=2;i<=n;i++) printf(" %d",fa[i]);
return 0;
}