02 2025 档案
摘要:给一个 $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$,其他的为 $0$。
三——一个非常重要的数,我们要考虑以下:
```
全是0:000 -> 0
一个1:001 -> 0
两个1:101 -> 1
三个1:111 -> 1
```
我们发现得到的答案取决于数量($0$ 多还是 $1$ 多)。
那我们怎么确定他能一直走到尾呢?
注意到:
```
??? -----> 00?
x00zy x00zy
```
也就是说,两个连续的在一起,能够使得上面也一样(但是要看边界)。
注意到要是中间有连续的(即最靠近中间的一段 $0$ 或者 $1$)说明顶尖就是大于等于数字。
我们发现这样具有单调性,于是乎可以考虑二分答案解决。
然后我们就很好的解决了该问题。
总时间复杂度 $\mathcal{O}(n\log n).$
阅读全文

浙公网安备 33010602011771号