CF1098F
题意
做法
显然得将串翻转
令\(up_{l,k}\)为\(l\)至根节点路径上深度为\(k\)的点
考虑多次查询\(\sum\limits_{k=1}^L up_{l}(k)\cap[1,l-1]\)
令\(S_1(L,l,M)=\sum\limits_{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]\)对重链的操作挂到链上去,则可以单独考虑一条链。
我们离线扫描\(x\in [1,n]\),令\(a_i\)为\(len_p=i\)的个数。则对查询的贡献为\(len_q\sum\limits_{i>len_p}a_i+\sum\limits_{i<len_p}i\times a_i\)
考虑多次查询\(\sum\limits_{k=1}^L up_{l}(k)\cap[1,l+L-k]\)
令\(S_2(L,l,M)=\sum\limits_{k=1}^L up_{l}(k)\cap[1,M-k]\)
依然考虑一条链的\(len_q,len_p\),但\([1,M-k]\)是动态右边界。这样处理\(\sum\limits_{k=1}^{len_q}\sum\limits_{v=1}^n [k\le len_p\And v\le M-(k+dep_y)](len_p\in i)\),\(y\)是当前链轻边上面。
\(v+dep_y+len_p\le M\)这类的可以化简为:\(\sum\limits_{v=1}^n [v+dep_y+len_p\le M]min(len_q,len_p)\)
\(v+dep_y+len_p>M\)这类可化简为:\(\sum\limits_{k=1}^{len_q}\sum\limits_{v=1}^n [v\le M-(k+dep_y)\And len_p>M-(k+dep_y)]\)