Guess The Tree

采用“利用已知构造未知”的方法,假设我们现在已经获得了树的一部分,设为\(A\),设\(B=\left\{1,2,3,...,n\right\}-A\)

每一次我们任选\(a∈A,b∈B\),令\(l=a,r=b\),询问\((a,b)\),如果得到的答案\(x\)属于\(A\),那么令\(l=x\),否则的话另\(r=x\),然后持续二分,最终会得到树上的一条边(看到询问次数也可以往二分想,只不过这个二分确实很新鲜)

易知上述过程的询问为\(O(n\log n)\)

一种错误做法:先一直询问\((1,i),i∈[2,n]\),如果答案\(x\)\(1\)那么说明\(1\)\(i\)相连,否则的话说明\(h[x]=\lfloor\frac{h[i]}{2}\rfloor\)(根节点\(1\)的深度为\(1\));然后进行搜索遍历,用一个栈存储根节点到当前节点路径上的所有点,当遍历到节点\(x\)的时候,如果\(h[x]\)为偶数,那么找出所有之前的\(n-1\)次询问答案为栈中深度\(\lfloor\frac{h[x]}{2}\rfloor+1\)\(i\),然后询问\((x,i)\),设答案为\(v\),添加边\((v,i),(i,v)\);错误原因就在于我们找出的是所有\(i\),而不是为\(x\)的子孙的\(i\)

posted @ 2024-08-22 08:22  最爱丁珰  阅读(9)  评论(0)    收藏  举报