恕我直言,这道炒鸡大码农题我至少在半年前就打算写了。
然而当时码力实在有限弃疗了(
其实主要就是拆一下式子,但是可持久化给他的码量带来了指数级的增长(
根据题意,每次询问每个点的贡献是 1+2+⋯+dis,其中 dis 表示这个点到询问的终点的距离。
对于每次询问 x,y,我们把路径上的点按 lca 分开讨论。
对于在 x→lca 上的点 i,有 dis=depi+depy−2deplca。
于是该点对答案的贡献是 (dis+1)dis2。
先不考虑除以二,把这个式子拆一下。
设 t=depy−2deplca。 (depi+t+1)(depi+t)ai=aidep2i+aidepi(2t+1)+ait(t+1)
另一半同理。 (depy−depi+1)(depy−depi)ai=aidepy(depy+1)−aidepi(2depy+1)+aidep2i
由上可见我们只需维护 ai,aidepi,aidep2i,depi,dep2i 的和即可。
以及最后不要忘了乘上 2−1mod20160501=10080251。
给出题人点赞——没写标记永久化暴力下推空间居然没爆(
代码:
1 |
|