『线段树』做题记录

这个是蒟蒻的线段树练习记录

cf573D

题意:给定人和马的ban匹配,表示对应人马不能互选,人马有权,让你选定人马两两匹配,总权为 $\sum_{i=1}^{n} a_i b_i$ ,支持修改任意两人的ban位置下,求每次查询总权最大值。

首先挖掘性质,首先显然需要用排序不等式,然后排序完,考虑扔掉限制后最优解必定是一一对应,然而考虑对于人 $i$ 可能匹配到哪匹马。

然后发现性质有 马必定取值为 $[i-2,i+2]$ ,这个考虑反证法即可,然后可以 $dp$ 。复杂度 $O(nm)$ 。

然后考虑怎么修改,然后就上套路动态 $dp$ ,然后显然单点修改,区间查询即可。实现细节有点多,稍微仔细点码即可。

复杂度 $O(m \log n \omega ^3)$ 。

p3707

题意:让你写一个数据结构,支持区间增加,区间 元素 $i$ 增加后加 $i$ ,还要求支持两个维度,查询求 $\frac{\sum_{i=L}^{R}(x_i-\overline{x})(y_i-\overline{y})}{\sum_{i=L}^{R}(x_i-\overline{x})^2}$

 这题就暴力做即可,有且仅考察码力。

p4458

题意:对于一个序列,支持区间加数,查询  $\forall d \in [l,r]$ 的长度为 $d$ 的简单路径和。

首先推式子:

$ans=\sum_{d=l}^{r} \sum_{i=d}^{n} \sum_{j=i-d+1}^{i} a_j$

记 $sum_i=\sum_{j=1}^{i} a_j$

$ans=\sum_{d=l}^{r} \sum_{i=d}^{n} sum_i-sum_{i-d}$

$ans=\sum_{d=l}^{r} (\sum_{i=d}^{n} sum_i-\sum_{i=0}^{n-d} sum_{i})$

记 $s_i=\sum_{j=1}^{i} sum_j$

$ans=\sum_{d=l}^{r} (s_n-s_{d-1}-s_{n-d})$

$ans=(r-l+1)s_n-\sum_{d=l}^{r} s_{d-1}-\sum_{d=l}^{r}s_{n-d}$

$ans=(r-l+1)s_n-\sum_{d=l-1}^{r-1} s_{d}-\sum_{d=n-r}^{n-l}s_{d}$

 果断上线段树维护前缀和的前缀和,然后考虑修改的影响,首先注意到小于 $l$ 的没有影响。

$a_d+=k (k \in[l,r])$

分类讨论:

1.$d \in [l,r]$

则 $s_d$ 会有:

$s_d+=\frac{(d-l+1)(d-l+2)}{2}k$

拆开后则有关于 $d$ 的二次函数,这玩意直接上 $3$ 个 $tag$ 即可。

2.$d > r$

则 $s_d$ 会有:

$s_d+=\frac{(r-l+1)(r-l+2)}{2}k+(r-l+1)(d-r)k$

拆开后则有关于 $d$ 的一次函数,这玩意同理即可。

然后做完了,复杂度 $O(n \log n)$ 。

arc115e

题意:对于一个序列,对于第 $i$ 个元素有 $a_i \in [1,A_i]$,查询 前后互不相等的序列 $a$ 的方案数。

这东西显然设计容斥 $dp$ , $f_i$ 表示前 $i$ 个元素的方案数 :

$f_i = \sum_{j=0}^{i-1} \min_{k=j+1}^{i} \{ A_k \} \times f_j \times (-1)^{i-j+1}$

然后发现 $\min_{k=j+1}^{i}$ 必定单调递减,然后线段树维护 $ \sum_{j=0}^{i-1} \min_{k=j+1}^{i} \{ A_k \} \times f_j \times (-1)^{i-j+1}$ 和 $ \sum_{j=0}^{i-1} f_j \times (-1)^{i-j+1}$  即可 。

对于每次转移可 $O(1)$ 查询 ,后 $O(\log n)$ 修改。

最终复杂度为 $O(n \log n)$ 。
posted @ 2022-06-05 19:57  Detect-Perplexity  阅读(25)  评论(0编辑  收藏  举报