T1 two
n ≤ 2 × 1 0 5 n\leq 2\times 10^5 n≤2×105
题意真的很难懂。。。
简而言之就是有两棵树,每次求对于其中一棵树 A A A的一条边 ( p , q ) (p,q) (p,q)(设 p p p为 q q q的父亲,即 q q q在 p p p子树内),在另一棵树 B B B上的边 ( x , y ) (x,y) (x,y)(设 x , y x,y x,y在 A A A中 d f s dfs dfs序满足 d f n [ x ] < d f n [ y ] dfn[x]<dfn[y] dfn[x]<dfn[y]),且满足 A A A中的两个点分别在 p p p的子树内和子树外。
实际上只有两种情况:
- i n [ p ] ≤ d f n [ x ] ≤ o u t [ p ] , o u t [ p ] < d f n [ y ] in[p]\leq dfn[x]\leq out[p],out[p]<dfn[y] in[p]≤dfn[x]≤out[p],out[p]<dfn[y]
- d f n [ x ] < i n [ p ] , i n [ p ] ≤ d f n [ y ] ≤ o u t [ p ] dfn[x]<in[p],in[p]\leq dfn[y]\leq out[p] dfn[x]<in[p],in[p]≤dfn[y]≤out[p]
考虑对于两棵树分别建立两颗线段树。
第一颗以 d f n [ x ] dfn[x] dfn[x]为下标,按 d f n [ y ] dfn[y] dfn[y]递增插入。第二颗以 d f n [ y ] dfn[y] dfn[y]为下标,按 d f n [ x ] dfn[x] dfn[x]递减插入。每个节点 v e c t o r vector vector储存下标区间对应边的另一端(第一颗是 d f n [ y ] dfn[y] dfn[y],第二颗是 d f n [ x ] dfn[x] dfn[x])。
每次查找相当于删去 v e c t o r vector vector末端的一段。直接线性扫指针,每条边存在于 log n \log n logn个节点中,所以时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)。
T2 bracket
n , m ≤ 5 × 1 0 4 n,m\leq 5\times 10^4 n,m≤5×104
点分治,记录每个点 i i i到分治重心 x x x的前缀 S i S_i Si(’(‘等价于1,’)'等价于-1)。
考虑一个合法点对 ( i , j ) (i,j) (i,j)( i i i走到 j j j,设分治重心为 x x x),则必然 S i + S j = 0 S_i+S_j=0 Si+Sj=0,且 S i S_i Si是 i i i到 x x x路径上的最大值, S j S_j Sj是 j