集训游记 7.17-7.18 数据结构

数据结构

线段树

单点修改,区间查询

只需要考虑区间维护什么信息可以通过子区间快速合并出当前区间的答案.

先确定出需要的信息,模拟合并过程是加入需要的信息.

序列上和相同数字位置有关的问题,考虑前驱表示法.

\(pre_i\) 表示 \(i\) 之前第一个和 \(a_i\) 相同的元素的位置.维护 \(pre\) 序列有助于解决一些问题.

P5278 算术天才⑨与等差数列

考虑有若干容易检查的限制来刻画等差序列.

  1. 区间 \(\max-\min=k*(r-l)\)
  2. 区间 \(\bmod\;k\) 的同余系相同.
  3. 区间中无重复数字.

满足这三个条件,区间中的数只可能是 \(\min,\min+k, min+2k,..., max\)

在检查区间 \(\bmod\;k\) 的同余系相同时,检查差分数组的 \(\gcd\) 是否是 \(k\) 的倍数.

静态数点问题的差分

寻常的矩形数点,如果没有修改,可以离线 \(+\) 差分答案使用一维数据结构简单地解决.

区间加区间 \(\gcd\)

考虑维护差分数组的 \(\gcd\)

因为有 \(\gcd(a,b)=\gcd(a,a-b)\).就是说将一个数减去另一个数的若干倍,既不会多出公因数,也不会减少公因数.

标记

设计标记考虑的两点:

  1. 标记和标记的合并.
  2. 标记和信息的合并.

例:区间加区间 \(\gcd\) 就无法维护 2. 标记和信息的合并

trie 树

常用于字典序贪心.

例题:

P8511 [Ynoi Easy Round 2021] TEST_68

堆,并查集

分裂搜索、合并单调性

例题:

线性并查集

没用的东西!

例题:

多次区间覆盖,询问最终序列上每个点的颜色.

把序列划分成若干长度为 \(\log n\) 的小块.对块做并查集复杂度为 \(O(\frac{n}{\log n} \log(\frac{n}{\log n}))=O(n)\)

LCA

树上差分通常会转换出这样的操作

  • 单点加,查询点到根的和
  • 点到根加,查询单点的值

对于第一种,考虑直接计算操作对可能询问的贡献.发现单点加只会影响到子树的答案.于是可以转化成在子树加单点查询.

对于第二种,考虑查询可能被计入询问的操作.发现只有子树内的询问会影响当前点上询问的答案.于是可以转化成单点加子树查询.

这种考虑操作对询问的贡献然后改换维护方式的转化,LXL 把其称为 数据结构反演

字符串哈希

没什么好说的

分块

例题选讲,杂项,一些理论

树上直径

对于树上点集 \(S\),任一点 \(u\)\(S\) 的最长路径端点在 \(S\) 直径中取到.

由此扩展,对于树上两个点集 \(S_1,S_2\).考虑 \(S_1\)\(S_2\) 的最长路径两端点,一个是 \(S_1\) 中直径的端点,一个是 \(S_2\) 中直径的端点.

取模复杂度均摊

考虑一个数对 \(p\) 取模,如果取模生效,则该数减半.

\(\red{未完全理解}\) 自由度分析

带区间修改的线段树,区间信息通常需要保证是 \(O(1)\) 的.否则无法保证高效更新.

比如经典的问题:区间加法,求区间 \(\le k\) 的数的个数.

寻常线段树求解问题一般不带有额外的变元——因为维护信息个数受限.比如可以维护区间的最大值或最小值.但区间 \(\le k\) 的数的数量就不好直接维护了.

这时我们应该果断放弃考虑寻常的线段树——要么思考高维数据结构,要么思考分块等其他数据结构.

posted @ 2023-07-16 09:31  ckain  阅读(41)  评论(0)    收藏  举报