合集-dsu on tree
摘要:给一个 $1$ 到 $n$ 的排列 $a$,并且给出点权 $x_i$,并定义:
$$
LCA\{b\}=lca(lca(\dots(b_1,b_2),\dots),b_m)
$$
其中 $lca(x,y)$ 表示 $x$ 和 $y$ 的最近公共祖先。
并且给出一颗树。
求:
$$
ans=\sum_{i=1}^n\sum_{j=i+1}^nx_{LCA_{i\in[i,j]}\{a_i\}}
$$
像这种比较经典的双 sigma 题目,最最最最暴力的解法是 $\mathcal{O}(n^3)$(先不考虑这里求 $LCA$ 的 $\log$)。
于是就很简单地拿到了此题的 $40$ 分。
那么怎么优化到 $\mathcal{O}(n\log n)$ 呢?
我一般的思路是直接上线段树。
我们这颗线段树(显然维护的是 $dfs$ 序区间)维护两个值,一个是 $cnt$ 代表这段区间内有点作为 $lca$ 的总方案,$sum$ 就是加和实际的数量 $\times x_{lca}$,注意到这里只有在有可能作为 $lca$ 的点上相乘,`pushup` 的时候都是加和(这里的思路比较巧妙)。
阅读全文
摘要:我将用两道例题来说明树上启发式合并的两种写法。 我先说明一种比较好写但是不是特别通用的写法。,因为这个空间复杂度令人堪忧。 树上数颜色 题目概述 给一棵根为 \(1\) 的树,每次询问子树颜色种类数。 数据范围:\(1\leq n,q\leq 10^5\)。 分析 挺模板的一道题目。 一般这种你代码
阅读全文
摘要:题目概述 题目链接:https://www.luogu.com.cn/problem/P1600。 给你一棵树,每个节点上有一个观察时间,现在有 \(m\) 个选手,选手会以每秒一个节点的速度,从 \(s_i\) 到 \(t_i\)。 求对于每个节点的观察时间能观察到多少个选手。 分析 经典题目记录
阅读全文

浙公网安备 33010602011771号