『线段树』做题记录
这个是蒟蒻的线段树练习记录
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)$ 。
题意:让你写一个数据结构,支持区间增加,区间 元素 $i$ 增加后加 $i$ ,还要求支持两个维度,查询求 $\frac{\sum_{i=L}^{R}(x_i-\overline{x})(y_i-\overline{y})}{\sum_{i=L}^{R}(x_i-\overline{x})^2}$
这题就暴力做即可,有且仅考察码力。
题意:对于一个序列,支持区间加数,查询 $\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)$ 。
题意:对于一个序列,对于第 $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)$ 修改。