题解讨论区_tourist_和Verdandi的代码有细节错误,无法通过此代码生成的数据。
例如_tourist_的代码在此处:
if(2*dep[pos]>rest)
{
rest/=2;
pos=S[now].lower_bound(mk(rest,0))->second;
vector<int> V; V.clear();
for(int i=0;i<(int)v[pos].size();i++)
{
int to=v[pos][i];
if(to==fa[pos]||vis[to]) continue;
V.push_back(to);
}
if((int)V.size()<2) V.push_back(pos);
printf("%d %d\n",V[0],V[1]); vis[V[0]]=1; vis[V[1]]=1;
rest-=dep[pos];
break;
}
暴力遍历了pos节点的直接儿子,因为在每次操作后没有删除选出来的节点,产生了时间复杂度上的错误。
hack数据生成方式:造了一棵以1为根,1的直接儿子为2和3,2的直接儿子个数为 2n−3,3的直接儿子个数为 2n−3+1的树。