Loading

P5305 [GXOI/GZOI2019] 旧词 树链剖分纸张题 / 离线技巧

首先不难发现就是在 LCA 那道题上加了一个指数。

考虑 LCA 那题做法的本质:我将区间差分,每次处理一个 \([1, l]\) 的前缀,依次对于每个前缀进行求解。

具体来说,这个式子的含义可以转化为我每次将一条 \(1\)\(i\) 的链加一,然后离线查询时直接从 \(x\)\(1\) 记一下贡献即可。

考虑这个式子的本质,假设你现在要求解 \(1 \sim l\) 的答案,那么我们先将 \([1, l]\) 内的每个 \(i\)\(1\) 的链上每个点的 \(siz\) 加一,那么容斥一下不难发现我们的答案本质上是这个(\(x_i\)\(x\)\(i\) 级祖先):

\[\sum_{i} dep_{x_i} \times ( siz_{x_i} - siz_{x_{i - 1}}) \]

考虑拆开这个式子:

\[\sum_{i} dep_{x_i} \times siz_{x_i} - dep_{x_i} \times siz_{x_{i - 1}} \]

进行邻项提取公因数后我们得到的式子是:

\[\sum_{i} siz_{x_i} \times ( dep_{x_i} - dep_{x_{i + 1}}) \]

我们发现此时这个式子中的第二项就等于 \(1\)了,于是我们的答案便只是:

\[\sum_{i} siz_{x_i} \]

不过带回到这题,答案便是:

\[\sum_{i} siz_{x_i} \times ( dep_{x_i} ^k - dep_{x_{i + 1}}^k) \]

发现第二项不是 \(1\) 了,不过我们仍然能够树链剖分解决,具体方法就是维护一个前缀和,区间加的时候打上一个区间的标记即可,第二项可以直接预处理算出来(对于一个点来说第二项系数不会改变)。

posted @ 2024-10-16 13:55  Alexande  阅读(22)  评论(0)    收藏  举报