CF1098F

题意

洛谷

做法

显然得将串翻转
\(up_{l,k}\)\(l\)至根节点路径上深度为\(k\)的点

\[\begin{aligned} \sum\limits_{i=l}^rlcp(s_{l,r},s_{i,r})&=\sum\limits_{k=1}^{L=r-l+1}min(dep(lca(l,l+k-1)),L-k+1)\\ &=\sum\limits_{k=1}^L up_{l}(k)\cap[l,l+L-k]\\ &=\sum\limits_{k=1}^L up_{l}(k)\cap[1,l+L-k]-\sum\limits_{k=1}^L up_{l}(k)\cap[1,l-1]\\ \end{aligned}\]

考虑多次查询\(\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)]\)

posted @ 2020-05-17 15:14  Grice  阅读(243)  评论(0)    收藏  举报