专栏文章
Trick 合集
个人记录参与者 2已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mioqeu11
- 此快照首次捕获于
- 2025/12/02 23:27 3 个月前
- 此快照最后确认于
- 2025/12/02 23:27 3 个月前
持续更新 ing……
数据结构(Data Structure)
- 区间查询操作的结果且为 做法时:
-
如果存在较小量且操作具有结合率:考虑倍增或线段树维护。
[eJOI 2024] 古迹漫步 / Old Orhei
题意
给定一个包含 个节点 条边的有向图(每条边编号为 )和一个长度为 的序列 ( 表示边编号)。需要处理 次操作:- 查询操作 ():从节点 出发,依次检查序列 的子区间 中的每个元素 。若当前节点 是编号为 的边的起点,则移动到该边的终点,否则不动。输出最终停留的节点。
- 修改操作 ():将序列 的第 项修改为 。
数据范围:,。思路
观察题目中的较小量是什么?不难发现 。而且,题目中的操作相当于移动点,如果某个点 经过前 次操作到达 , 经过后 次操作到达 ,则 经过总共的 次操作会到达 。这说明,题目中的操作是满足结合率的。也就是说,线段树是可以合并节点的。对于每个节点,维护 每个点经过该节点对应区间后对应的位置。pushup的时候,直接按上文所说合并即可。 -
如果不存在较小量且每次操作本质上是合并两个集合(比较罕见):解决方案本质上是使用广义上的 Kruskal 重构树(或者应该叫做 DSU 重构树?),每次合并两个集合的时候,新建节点,并将两个集合的对应节点连接该点。这样的好处在于每两个点的 LCA 记录了这两个点最小加入同一集合的时刻。这对维护区间操作结果有很大的作用。
花田魔法 (flower)
题意
给定长度为 的序列 ,初始 。有 种魔法:- :,。
接下来有 次询问:- :依次施加第 种魔法,序列 有多少个极长颜色连续段。
例如, 序列为 ,则极长颜色段为 。注意: 每次只是假想地施加魔法,并没有真正的进行,即不同询问之间是独立的。数据范围: 。思路
Hint 1: 怎么做?
考虑对极长颜色段拆贡献,转化为 的 的数量。考虑将每次 看作是一条边,每次导致两个集合变为同一个值,也就是合并两个集合。于是,每次 DSU 暴力维护即可。查询判断有多少个 和 不在同一个集合。Hint 2:如何用 DSU 重构树描述 Hint 1 中的过程
考虑每次 和 合并的时候,新建一个节点,作为 和 的父亲,同时另该节点的颜色为 。如果不存在颜色 ,则新建一个节点,作为 的父亲。注意,这里再表述 和 节点的时候,均指最后一次颜色为 和 的节点编号。这样,在这棵树上,可以很好地通过 LCA 来判断两个点从什么时候开始在同一个集合。现在是区间查询,有两个维度(左边界和右边界),扫描线来处理左边界,右边界在 DSU 重构树上处理。考虑 从 到 枚举,每次相当于在树上插入首次操作。这是容易的,只需要新建节点 ,颜色为 ,并将 的父亲定为 , 的父亲定为 , 的父亲定为原来 的父亲(如果存在)。每次只会更新 个点,LCA 只会变化 个。因为只有 和 的 LCA 发生变化。于是,只需要动态维护 LCA,这里由于每次都是改叶子,所以是可以通过倍增数组做到 维护的。
-
动态规划(Dynamic Programming)
-
分步转移:当 DP 维度中存在多个转移互相独立的维度,每次转移时每个维度同时枚举可以转变成仅枚举一个维度,并用 0/1/... 记录已经转移了哪些。
跳石头 (stone)
题意
给定 的矩形,初始两只脚分别位于第 列,终点为两只脚均位于第 列。令 表示左脚在第一排的第 个石头上,右脚在第二排的第 个石头上,那么你可以进行一次跳跃:选择一对整数 ,然后左脚跳到第 个石头上,右脚跳到第 个石头上,这次跳跃消耗的体力为 。试求从起点到终点最小消耗的体力是多少数据范围: 。思路
令 表示左脚位于 位置,右脚位于 位置的最小消耗的体力。转移枚举下一次的位置 ,时间复杂度为 。不过,不难发现题目斜率优化的形式,只不过二维斜率优化是困难的。于是,考虑左脚、右脚实际上是独立的,可以分部转移。从而优化到一维斜率优化。时间复杂度 。
字符串(Strings)
-
LCP 和 LCS 可以转化为区间最小值:将字符串按字典序排序,则两个字符串 和 的 LCP 为 中相邻两个字符串的 LCP 的最小值(LCS 同理)。
字符串 (string)
题意
给定两个字符串 ,定义 为通过以下操作使得 的最小操作数。如果无法通过操作使它们相同,则 。一次操作定义为:选择 或者 ,选择它的一个子区间 ,将该子区间的所有字符按字典序从小到大排序。现在给定 个长度相等的字符串 ,请计算出 。数据范围: ,,,。思路
观察到, 的值仅有 种:- :。
- 排序某个区间能变成 :。
- :。
- :。
考虑将字符串按照 排序,那么只需要考虑每个极长相等段即可。于是,计算 的对数,这样用总数减去 (容易计算)减去 的对数,便是 的对数。考虑每个字符串 的每个单调不降的极长区间 ,只需要计算有多少个字符串与 的 LCP 大于等于 ,LCS 大于等于 。将 LCP 和 LCS 转化为区间 之后,不难发现,合法答案在两段区间的交集,将每个字符串变成二元组,这样每次相当于矩阵和。二维偏序,扫描先即可。时间复杂度:。
数学
- 整除分块区间 满足 。
- 数字 除 下取整两两不同。
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...