hack第一篇题解
查看原帖
hack第一篇题解
625206
Remilia1023楼主2023/3/28 23:41

@影法师 的题解 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 可能只是碰巧对了,因为 gg 自己要用到后 lenlen 个位置,重儿子会往前移 len1len-1 个位置 所以正解应该是 posg += len + 1; g[v] = posg; posg += len + 1;,或者可以把 +1+1 改为更大值也行。

于是就想了一种情况让第二次指针移动范围很小,第三次调用范围比较大使其冲突。

具体来说:

(1)(1) 11 下挂一条极长链

(2)(2) 11 下挂一棵子树 1 2 \n 2 3 \n 2 4

(3)(3) 11 下挂一条长度相同的极长链

造了组数据,成功了!!!

这个东西很容易手算,答案显然是 44,然后我的代码与其他一些题解代码输出也是 44,但是这篇题解输出 55

数据生成器:

#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;
}
2023/3/28 23:41
加载中...