以下是做P3224 [HNOI2012] 永无乡过程中得到的两份代码,其中,仅仅dfs(int u,int b)函数的内容不一样,具体地讲,AC代码中最后insert当前节点,而TLE代码中按中序遍历合并。
AC代码,TLE代码。
区别如下:
AC:
void dfs(int u,int b){
if(tr[u].s[0]) dfs(tr[u].s[0],b);
if(tr[u].s[1]) dfs(tr[u].s[1],b);
insert(tr[u].v,tr[u].id,b);
}
TLE:
void dfs(int u,int b){
if(tr[u].s[0]) dfs(tr[u].s[0],b);
insert(tr[u].v,tr[u].id,b);
if(tr[u].s[1]) dfs(tr[u].s[1],b);
}
AC记录,TLE记录。
经过同机房讨论,应该是双旋即splay(int x,int k,int b)函数的影响,“最后插入根使得合并树保留了原来的势能”,但是没有严格证明。
请问有人能对此做出严格的解答吗?