@影法师 的题解 QAQ 假了。
int len = height[to] - dep[to] + 1;
f[to] = posf;
posf += len;
posg += len * 2 + 10;
g[to] = posg;
这个写法看上去好假,就想了下能不能 hack 掉。
posg += len * 2 + 10 可能只是碰巧对了,因为 g 自己要用到后 len 个位置,重儿子会往前移 len−1 个位置
所以正解应该是 posg += len + 1; g[v] = posg; posg += len + 1;,或者可以把 +1 改为更大值也行。
于是就想了一种情况让第二次指针移动范围很小,第三次调用范围比较大使其冲突。
具体来说:
(1) 1 下挂一条极长链
(2) 1 下挂一棵子树 1 2 \n 2 3 \n 2 4
(3) 1 下挂一条长度相同的极长链
造了组数据,成功了!!!
这个东西很容易手算,答案显然是 4,然后我的代码与其他一些题解代码输出也是 4,但是这篇题解输出 5。
数据生成器:
#include <bits/stdc++.h>
using namespace std;
int main()
{
freopen("hack.in", "w", stdout);
cout << 2006 << endl;
cout << "1 5\n";
for (int i = 6; i <= 1005; i++) cout << i - 1 << ' ' << i << endl;
cout << "1 2\n2 3\n2 4\n1 1006\n";
for (int i = 1007; i <= 2006; i++) cout << i - 1 << ' ' << i << endl;
return 0;
}