采用“利用已知构造未知”的方法,假设我们现在已经获得了树的一部分,设为A,设B={1,2,3,...,n}−A
每一次我们任选a∈A,b∈B,令l=a,r=b,询问(a,b),如果得到的答案x属于A,那么令l=x,否则的话另r=x,然后持续二分,最终会得到树上的一条边(看到询问次数也可以往二分想,只不过这个二分确实很新鲜)
易知上述过程的询问为O(nlogn)
一种错误做法:先一直询问(1,i),i∈[2,n],如果答案x为1那么说明1与i相连,否则的话说明h[x]=⌊h[i]2⌋(根节点1的深度为1);然后进行搜索遍历,用一个栈存储根节点到当前节点路径上的所有点,当遍历到节点x的时候,如果h[x]为偶数,那么找出所有之前的n−1次询问答案为栈中深度⌊h[x]2⌋+1的i,然后询问(x,i),设答案为v,添加边(v,i),(i,v);错误原因就在于我们找出的是所有i,而不是为x的子孙的i
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构