求调站外题
  • 板块学术版
  • 楼主OldDriverTree
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/7 22:45
  • 上次更新2023/11/8 13:05:32
查看原帖
求调站外题
681036
OldDriverTree楼主2023/11/7 22:45

题目链接,提交链接 是不是交互写挂了?

#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; //p 到 LCA 的距离
			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;
}
2023/11/7 22:45
加载中...