Rainboy 个人题单
Rainboy 自己维护的训练题单,按专题分章节记录正在攻的知识点与题目顺序。
Rainboy 个人题单
一、线段树
本章的学习路线:主线是 P3372 → aalc001_c → 19D → P4116;U420425 与 U502676 是插在中间的补充题,可以先过主线,卡在“下降”上时再回来刷这两道。
flowchart TD P3372["线段树单点改/区间查<br/>P3372 或已会"] aalc001c["AT aalc001_c<br/>只练「下降」这 15 行"] CF19D["CF19D Points<br/>二维 + max 聚合 + 找最小坐标"] P4116["P4116 Qtree3<br/>把 (x,y) 换成 (dfn, rdfn),min 代替 max"] U420425["U420425 线段树二分 2<br/>懒标记 + 按和下降"] U502676["U502676 线段树上二分模版<br/>维护 max + 找第一个大于 k"] P3372 --> aalc001c aalc001c --> CF19D CF19D --> P4116 P3372 -.-> U420425 U420425 -.-> U502676 U502676 -.-> aalc001c
- 训练点:懒标记下传时机,左右区间边界,
long long防溢出。 - 训练点:区间和够不够用「还差多少」表示;树上下降依赖元素非负带来的单调性。
- 训练点:把聚合量从区间和换成区间最大值;判据从「够不够」换成「这段最大值是否大于 k」,
mx <= k就整段剪掉。 - 训练点:带着余量
rem下降;向右找最小、向左找最大 两个方向的对称写法;无解用哨兵位置吸收。 - 训练点:外层按
维护区间最大 ; mx <= limit剪枝定位最左;组内用 std::set或压缩后的 Fenwick 找大于的最小值。 - 训练点:双 dfs 序把祖先关系化成二维偏序;结点维护 min 后找第一个
rdfn <= Y的位置;对照重链剖分 + 每条链set的写法,理解两种做法的取舍。
二、序列与路径上的「先买后卖」
本章的学习路线:先在一维上把观察练熟(LeetCode 121 是已经会的那一版),再依次换容器——把「整个数组」换成「任意询问区间」(ROJ 1820),把「数组」换成「图上的一条有向路径」(abc188_e),最后把「一条路径」换成「树上路径 + 整段加价」(P3976)。每换一次容器,摘要就要多带一点东西:区间版要可合并,DAG 版要拓扑序,树版要能反着用并支持懒标记。
flowchart TD L121["LeetCode 121<br/>整个数组一次扫描,维护此前最低价"] R1820["ROJ 1820 区间最大利润<br/>任意询问区间,摘要 (min, max, best)"] A188E["AT abc188_e Peddler<br/>数组换成 DAG,按编号做拓扑序"] P3976["P3976 旅游<br/>树上路径 + 路径加价 + 反向段"] L121 --> R1820 L121 --> A188E R1820 --> P3976 A188E --> P3976
- 训练点:把「历史最低价」压成可合并摘要
,合并时必须带上跨段项 ;再对照倍增写法,理解「合并满足结合律」才是能上树的前提。 - 训练点:
保证编号就是拓扑序,一次扫描维护「能走到 的最低买价」;注意答案允许为负, 0不能当初始化兜底。 - 训练点:路径拆成
段 dfn 区间后, 侧的 dfn 增序与旅行方向相反,所以摘要要带 bwd、查询要flip;整段加价只平移最值,正好用懒标记。
三、扫描线与差分
y 方向上要的是「区间加、单点查」,所以这一章的前置是差分 + 树状数组;真正的新东西是把每个矩形拆成「进入 / 离开」两个事件,按
- 训练点:矩形拆成
加、 减两个事件;同一个 上先做事件再回答询问,半开区间的边界处理被顺序自动吸收;坐标到 先离线离散化再开树状数组。