这题貌似很 naive 呢……
根本不需要取模的说,n 个数中数对的个数最多是 n2=108。 首先,询问 p,LCA 为 p 的点对有两种情况: - 至少一个为 p。 - 分别在两棵以 p 的不同儿子构成的子树中。
前一种很好理解,后一种若它们在同一棵子树中,很显然可以找到 p 的一个儿子为更近的祖先。
并且注意点对是区分顺序的。
设 sizep 表示以 p 为根的子树的结点个数,sonp 表示 p 的儿子的集合,
第一种情况就是 2sizep−1,因为 (p,p) 重复所以要 − 1。
第二种情况,∑∀x,y∈sonp,x≠ysizex⋅sizey,但是这样还不够优,所以可以优化为 ∑∀x∈sonpsizex⋅(sizep−sizex−1)。
此外数据范围显示有可能 m>n,所以我们可以记忆化一下,以免被菊花图询问 m 次根的毒瘤数据卡掉。
代码:
1 |
|