U622285 【模板】DFS 序求 LCA

题目背景

>**注意:** >- **本题极其卡常,请开启 O2 优化,选择 C++14(GCC 9) 语言,并使用快读,否则不保证能否通过。** >- **此题为 DFS 序求 LCA 模版题,请不要用树剖进行无意义的卡常。** [~~无耻宣传~~](https://www.cnblogs.com/lyas145/p/18778784)(看过的请无视) 之前的数据造小了,现已更正数据。 鉴于本题过于卡常,本题时限开大到 2.5s。

题目描述

给你一棵有 $n$ 个节点的树,其根节点编号为 $rt$。 有 $q$ 次询问,对于每一次询问,请你求出两个节点的 LCA。 ### 数据范围 对于 $100\%$ 的数据,保证 $1\le n\le 10^6$,$1\le q\le 10^7$,$1\le a,b\le n,1\le seed

输入格式

第 $1$ 行,两个正整数 $n,rt$,分别表示节点个数和根节点的编号。 第 $2\sim n$ 行,每行两个正整数 $a,b$,表示节点 $a,b$ 之间有一条直接相连的边。 第 $n+1$ 行,两个正整数 $q,seed$,分别表示询问次数和一个参数。 为了避免大量的输入,请采用下面的方式生成数据(C++): ```cpp typedef unsigned int uint; uint seed,lt; uint get_node() { seed^=seed5; seed^=seed*lt+1145; return seed%n+1; } int main() { ... q=read();seed=read(); while (q--) { int x=get_node(),y=get_node(); ... } } ``` 其中 $lt$ 表示上一次询问所得的答案,如果是第一次询问,则为 $0$;`read()` 是快读函数。

输出格式

为了避免大量的输出,设第 $i$ 次询问的答案是 $lca_i$,那么最终输出一行一个整数 $ans=\oplus_{i=1}^q(i\times lca_i)$。

说明/提示

【样例解释 #1】 每组询问分别为 ``` 6 5 2 6 3 1 6 6 6 4 6 2 1 2 3 1 ``` 对于每次询问,答案分别为 ``` 5 2 5 6 5 2 2 5 ``` 计算后可得最终答案 $37$。