题意
做法
显然得将串翻转
令(up_{l,k})为(l)至根节点路径上深度为(k)的点
考虑多次查询(sumlimits_{k=1}^L up_{l}(k)cap[1,l-1])
令(S_1(L,l,M)=sumlimits_{k=1}^L up_{l}(k)cap[1,M]),即(l)至根节点最上面(L)个点,每个点子树与([1,M])所交之和。
令(l)至根最上面的(L)个点为([1,L])。
考虑重链剖分。(l)至根节点的剖分,每条链都有一个值(len_q),表示这条链有多少个点为最上面(L)个点;([1,M]),单独考虑任意点(i),将其至根的路径全部(+1),每条链有一个值(len_p)。每条链对答案的贡献为(min(len_q,len_p))。其实就是([1,M])中的每个点与([1,L])之交的和。
考虑如何处理(min(len_q,len_p))。
将所有询问与([1,n])对重链的操作挂到链上去,则可以单独考虑一条链。
我们离线扫描(xin [1,n]),令(a_i)为(len_p=i)的个数。则对查询的贡献为(len_qsumlimits_{i>len_p}a_i+sumlimits_{i<len_p}i imes a_i)
考虑多次查询(sumlimits_{k=1}^L up_{l}(k)cap[1,l+L-k])
令(S_2(L,l,M)=sumlimits_{k=1}^L up_{l}(k)cap[1,M-k])
依然考虑一条链的(len_q,len_p),但([1,M-k])是动态右边界。这样处理(sumlimits_{k=1}^{len_q}sumlimits_{v=1}^n [kle len_pAnd vle M-(k+dep_y)](len_pin i)),(y)是当前链轻边上面。
(v+dep_y+len_ple M)这类的可以化简为:(sumlimits_{v=1}^n [v+dep_y+len_ple M]min(len_q,len_p))
(v+dep_y+len_p>M)这类可化简为:(sumlimits_{k=1}^{len_q}sumlimits_{v=1}^n [vle M-(k+dep_y)And len_p>M-(k+dep_y)])