0802 模拟赛

听说把吹水放在开头会有更多人看。

那,如果我写的对就留个评论吧,不然我会觉得各位大佬认为写的东西太简单,看不起我😭

T3

题意真长,我不想写了。

\(rt\) 为根时,\(x\) 的 SG 为 \(S(x,rt)\)

首先点 \(S(x,rt)\) 就是 \(x\) 到子树内的最深链长度,也就是说可以换根 DP 求出它到每个子树内的最深链,然后取最大值 \(f_x\) 和次大值 \(g_x\),我们就知道以任意点为根的时候 \(S(x,rt)\)。而 \(S(x,rt)=g_x\) 时,\(rt\) 的范围是 DFS 序的一段区间,那么我们就可以算出以 \(rt\) 作为根的时候,所有棋子的 SG 异或和 \(s_{rt}\) 了。

先看后手的超能力,增添一枚棋子也就是让 \(s_{rt}\) 异或上一个 \(S(k,rt)\),这显然是一个 \([0,S(rt,rt)]\) 内的任意整数,也就是先手必胜当且仅当 \(s_{rt}>S(rt,rt)\)。那么现在我们已经可以 \(O(\textit{dep}_y)\) 回答一次询问。

而我们发现,将 \(y\) 的所有儿子 \(u_1,u_1,\ldots,u_k\) 作为根时,\(S(x,u_i)\) 很多时候都是相等的。具体而言:

  • \(x=y\) 时,只有 \(f_x\) 所对应的子树的 \(u_i\) 作为根时,\(S(x,u_i)\) 可能会不同;
  • \(x=u_i\) 时,只有 \(x\) 作为根时 \(S(x,u_i)\) 可能会不同;
  • 否则一定全部相同。

也就是说,不同的数会在 \(O(1)\) 级别,可以暴力找出来计算。那么考虑相同的情况,相当于问 \(u_1,u_1,\ldots,u_k\) 中有多少个 \(u\) 满足 \(s_{u}\operatorname{xor} S(x,u)>S(u,u)\),其中 \(S(x,u)\) 为定值。这个就很容易利用 P7502 的套路放在 trie 树上解决了。时间复杂度 \(O(n \log n)\)

闲话:不知道为啥这么简单的东西考场上硬是觉得很复杂,然后没看出来。话说回来还是梳理思路的必要性😠

posted @ 2022-08-02 18:33  Ilith  阅读(48)  评论(0编辑  收藏  举报