考逝总结
1795MiB
·
2024-04-27 17:22:07
·
个人记录
20240111 - 20240116 没有写每道题的用时.
历史遗留
DP中需要枚举时, 将等于某个数改为大于等于/小于等于某个数可能更优.
当值域过大时, 考虑能否排除不可能出现的值域.
例题(20230814 T3):\
给定一个长为 n 的序列 a , 定义一个序列的完美度为任意两个数差的绝对值的最小值, 求该序列长度为 k 的不一定连续子序列的完美度之和. 对 998244353 取模.\
题解:\
枚举完美度, 范围为 $\frac {kMaxV}{k - 1}$ , 考虑计算完美度大于等于该值的方案数. 设 $f_{i,j}$ 表示前 $i$ 个位置中选择了 $j$ 个, 且第 $i$ 个必选的方案数, $pre_i$ 表示当枚举的完美度为 $w$ 时, 满足 $a_{pre_i} + w \le a_i$ 的最大的 $pre_i$ . 则 $f_{i,j} = \sum_{k=0}^{pre_i} f_{k,j-1}$, 使用前缀和优化即可.
推式子时注意不要打错符号, 注意枚举的范围.
例题(20230814 T1):\
给定长为 n 的序列 a , 将其分为 left , mid , right 的非空三段, 令其代价为 \max(sum_{left}, sum_{mid}, sum_{right}) - \min(sum_{left}, sum_{mid}, sum_{right}) + x \times mid , 其中 x 为给定的常数, 求最小代价.\
题解:\
不妨设 $sum_i$ 为序列 $a_i$ 的前缀和, $i$ 为 $left$ 与 $mid$ 的分割点, $j$ 为 $mid$ 与 $right$ 的分割点, $sum_{left} \le sum_{mid} \le sum_{right}$ .
则 $sum_{left} = sum_i, sum_{mid} = sum_j - sum_i, sum_{right} = sum_n - sum_j$ .
此时代价为 $sum_n - sum_j - sum_i + x \times j - x \times i = (sum_n - sum_j + x \times j) + (-sum_i - x \times i)$, 同时需满足 $sum_i \le sum_j - sum_i \le sum_n - sum_j$ , 即 $sum_i \le \min(\frac{sum_j}{2}, sum_n - sum_j)$ .
从 $2$ 到 $n - 1$ 枚举 $j$ , 对于每个 $j$ 使用平衡树维护对应的区间最小值即可.
当出现绝对值时, 考虑枚举每一项的大小关系或正负性.
例题(20230814 T4):\
给定 n 个 k 维的点, 定义 n 个点间的权值为任意两点之间的曼哈顿距离的最大值. 在 q 个询问中, 每次修改一个点的坐标, 或者查询编号 [l, r] 间的点的权值.\
题解:\
考虑每个点贡献的方式, 每一个维度要么为正数要么为负数, 则枚举每个维度的情况, 开 $2^k$ 棵线段树维护即可.
线段树使用动态开点时, 空间消耗要计算清楚, 否则就使用全局变量优化并开到低于空间限制25Mib.
例题(20230818 T2):\
给定一个长为 n 的序列 a_i , 定义一个查询 (l_i, r_i, c_i) 代表在区间 [l_i, r_i] 内, 严格跨越下标 c_i 的相同值的点对的距离之和(每个值仅计算距离最小的).\
题解:\
咕咕咕
准备乱搞前先考虑DP做法.
例题(20230818 T3):\
给定通过 n + 1 条路段的所需时间, 每两条路段间设有一个红绿灯, 全体红绿灯都从时刻 0 开始以 绿 g 秒 - 红 r 秒循环的方式切换状态, 现有 q 辆车分别于时刻 t_i 穿越这些路段, 求完成穿越的时刻.
题解:\
考虑设 f_i 表示在红灯切换为绿灯时通过第 i 个红绿灯后穿越剩余的路段所需时间. 则有 f_i=f_{nt_i} + dis_{i, nt_i} + wait_{i, nt_i} , 其中 nt_i 表示下次被红灯挡住的红绿灯编号, dis 与 wait 显然容易求得. 从后往前遍历红绿灯, 使用平衡树维护红绿灯信息, 求区间最小值即可求得 nt_i . 对于每个询问使用相同方法处理.
DP不了再考虑贪心做法.
例题(20230818 T4):\
咕咕咕
题解:\
咕咕咕
20240111 总结
T1(road) [竞赛图三元环] [扫描线]
期望:20 实际:20 难度:3
想到了容斥, 但卡在了出边指向的任意两个点间都有连边的性质上.
考虑容斥三元环并未用到完全图这一强性质, 每次思路卡住时应回过头观察已有条件.
T2(graph) [费用流] [随机化]
期望:30+ 实际:50 难度:3
发现状态过于庞大, 大概只能用网络流.
费用流的建图不难想到, 发现这种模型只适用于二分图; 最终答案为森林不难想到.
考虑只适用于二分图的原因为无法考虑内部的连边, 于是只需保证答案的边均不在内部. 当确定思路的大体方向正确时, 考虑当前错误做法的原因并修正.
T3(jigsaw) [链求和转子树求和] [莫比乌斯反演]
期望:24 实际:24 难度:4.5
考虑 (a, b) 只有至多一种转移, 故形成树结构. 对于计数问题考虑变换求和顺序使得求和更为简洁.
注意到, 分段打表可以多拿24.
结算
前一天晚上没睡好, 晕了两小时. 但是睡眠时间比平时长1.5h
20240112 总结
T1(key) [格点多边形内格点数量]
期望:100- 实际:23 难度:2
猜了一个显然错误的结论, 考场上竟然没有意识到.
凸包的部分容易想到. 考虑怎么计算多边形内格点数量.
根据 Pick 定理:
格点多边形面积 = 内部的格点数量 + \dfrac{边界的格点数量}{2} - 1
或许可以记忆为, 教室里的学生交学费, 挂墙上半价, 老师不用付.
其实也想到了 三角剖分 + 拆一般三角为直角三角, 但由于自我感觉实现过于复杂一直没有动手, 实际上写出来只有 2.7k .
T2(hammer) [整体操作小范围考虑] [构造]
期望:5 实际:0 难度:5
将 字典序排名 转化回 排列 的过程出错了. 第一次写这玩意. 使用 map 可以容易避免这一错误.
对于一个允许你搞的很长很复杂的操作, 考虑一些特例使得操作变简单(对任意长度的连续段 -> 对长度为 3 的连续段).
对于要求构造方案且不好 Dp 的问题, 考虑将其的规模一步步缩减为子问题(如求 排列 的 字典序排名).
T3(shoes) [非 Dp 类计数]
期望:38 实际:25 难度:3
大体思路与题解一致, 缺少了部分细节与实现的时间. 考虑到 网格图 本身具有拓扑序, 无需进行 树形 Dp , 可降低实现难度.
## 结算
做 T1 时过于犹豫, 反而浪费了很多时间.
难写的保证正确性的算法 >> 不算好写的不保证正确性的算法 .
# 20240115 总结
## T1(matrix) [分治] [二维转一维]
期望:60 难度:3
大体思路与正解一致, 但由于特殊性质想到了循环节, 后发现去掉特殊性质后循环节不好做放弃.
对于一个二维不好搞的问题, 考虑将其归约至一维.
## T2(road) [三角剖分] [异或 Hash]
期望:10 难度:4
看到平面图边数为 $2n - 3$ 居然没想到是三角剖分.
对于一个复杂的构造问题, 考虑一种最简单的构造(如菊花图).
## T3(shoes) [神秘线段树]
期望:3 难度:4
主要是没有想到一个数能连的边很少, 但实际上即使这个常数为因数个数 $O(n^{\frac{1}{3}})$ 也是可接受的.
## 结算
做完 T1 60分后想冲正解, 结果浪费了大量时间(虽然也有 vp 的因素在).
# 20240116 总结
## T1(cheer) [树上差分] [枚举质因数求 Gcd]
期望:10 实际:5 难度:4
没有特判一堆东西.
求 Gcd 一类的东西时, 各质因数是独立的可以分别考虑, 只需已知一个数作为 Gcd 确定的倍数.
同时, 给一个数加上一个数比直接删掉一个数好做.
树上差分不仅可以差父亲, 也可以把儿子全差一遍.
## T2(memory) [二分答案] [圆内直线交点计数]
期望:15 实际:15 难度:3
圆内两直线有交点即对应的弧有交且不包含. 与圆有关的直线要转成弧(Pty 题单里 奶牛互相看见 那道题).
## T3(return) [根号分治] [分块] [类天使玩偶] [莫队]
期望:40 实际:32 难度:3.5
莫队中使用 树状数组 而未使用 值域分块 平衡复杂度.
对于一类暴力求需要维护很多信息($O(n)$ 这种)的题目, 除 莫队 外还有 分块 可以考虑.
## 结算
再次在 T1 上浪费了大量时间, 简直像是被外星人附体了.
找要开的题的一种方法: 挑一眼就会的部分分最多的. 并且, 若连续 30min 没有想出新的部分分, 弃掉换另一道题.
别再在老歪脖子树上吊死了.
# 20240117 总结
## T1(witch) [大型树形 Dp] [线段树合并]
期望:56 实际:60 难度:2 用时:3h
数据过水导致的.
对于 Dp 中需要统计子树内各类点的信息的一类问题, 若 分类的限制容易满足 且 统计的合并方式较简单(如直接求和) 但 不好直接由儿子继承, 则考虑线段树合并.
写 Dp 方程前一定考虑清楚每个状态代表什么.
## T2(tree) [边分治] [Kruskal]
期望:30 实际:30 难度:4 用时:1h
对于复杂的树上路径问题(即别的算法都想过了之后), 考虑点/边分治.
Boruvka 的思想并不局限于全程都要找最小的. 也可以对于一些神秘连通块做一遍, 最小生成树的边集 一定属于 得出来的边组成的边集.
## T3(string) [矩阵乘法] [循环匹配]
期望:0 实际:0 难度:4.5 用时:0.5h
看到 $id \le 10^{18}$ 居然没有想到矩阵乘法.
对于求 字符串 在 一个由一堆字符串拼接起来的大字符串 中的匹配, 考虑让这一堆字符串的长度都不少于模式串的长度, 这样至多只会跨越一个串, 可以大力分讨.
对于求 字符串 在 另一个字符串 中循环匹配的问题, 考虑复制一遍, 母串建 SAM, 找到每个位置作为结尾匹配的最大长度, 再一步步跳 fail, 累加 |endpos|.
## 结算
做出 T1 的 $O(n^2)$ 算法后, 及时放弃开写代码, 减少了时间浪费. 事实上, 观察代码不难发现线段树合并的优化.
# 20240119 总结
## T1(mulsign) [莫队] [分治]
期望:40 实际:40 难度:2 用时:2h
带有各种前缀和的式子不难推出, 想维护不难想到莫队.
在发现这玩意不好维护之后, 应及时回到最初的式子考虑别的思路. 事实上, 分治的想法是不难想到的.
用线段树维护一坨与 绝对位置/前缀和 等有关的东西时, 不要直接维护, 而是在合并两个区间时将右侧区间的上述值进行偏移, 可以极大降低实现难度与常数.
## T2(emotion) [贡献拆分] [子集卷积]
期望:0 实际:0 难度:4 用时:1h
考场上想到的是枚举 组成环的点集 并统计 每种方案的路径权值和, 但显然可以只枚举一条边统计作为基环树中环的方案数.
## T3(chorus) [笛卡尔树]
期望:25 实际:25 难度:4.5 用时:2h
笛卡尔树可以极大的降低思维难度, 当看到序列上可以离散化的问题时, 考虑用笛卡尔树辅助思考并描述条件.
Dp 时每个状态的转移的限制条件可以不用依次求出, 而是全部一起求完后再进行 Dp. 有时当前状态的限制可以用以前的限制辅助求出.
## 结算
做 T1 时思路陷入了死路, 当很久没有进展之后考虑向后回退一步考虑其他思路.
# 20240120 总结
## T1(a) [Nim 游戏]
期望:100 实际:100 难度:1 用时:1h
略.
## T2(b) [Dp 状态化简] [FWT]
期望:60 实际:60 难度:2.5 用时:2.5h
Or 卷积的点值表达式就是高维前缀和, 而 And 卷积为高维后缀和. 利用这一性质可以直接维护点值表达式, 而可以避免 FWT 与 IFWT .
对于限制较多的 Dp, 考虑先进行容斥消去一些限制, 如 20240117 witch.
## T3(c) [alcS] [分治]
期望:10 实际:10 难度:5 用时:1.5h
想了很久只想到了可以分治. 原来是论文题.
## 结算
T3 仍浪费了一定时间, 中途有大约 1h 的时间没有进展. 用来想 T2 应该能切.
(一样的还不一定能做到的考场策略此处不重复).
# 20240122 总结
## T1(physics) [组合数学]
期望:100 实际:100 难度:2.5 用时:2.5h
当发现做了碰球问题一步经典转化后无法做了之后及时重新调整思路.
最后化式子的时候居然没一眼看出来吸收公式多想了 10min .
## T2(vaguelette) [拆分贡献] [拉格朗日插值]
期望:10 实际:0 难度:4.5 用时:30min
想了 10min 没有想到 $F(T, a)$ 的求法. 实际上考虑一条边是否会有贡献是一个很经典的思路(如 20240119 emotion). 再想不到就要放首页了.
对于一个二维的 Dp 数组, 可以认为它是 $n$ 个多项式, 直接维护点值最后插值就可以求出所有 $Dp_i$ 的带权和.
## T3(partial) [分块]
期望:50 实际:50 难度:3.5 用时:2h
链的三分做法差不多想好了. 实际上可以二分. 并且与正解的思路相差很大.
对于数据结构不好维护的奇怪查询, 考虑对询问修改分块. 可以大力预处理, 但修改需要能够快速进行.
## 结算
T2 $m = 2$ 的暴力没有注意到无需枚举子序列和求 $F(T, a)$ , 感觉写不完且难调就放弃了, 遗憾少了 10pts.
# 20240123 总结
## T1(b) [多项式快速幂]
期望:100 实际:40 难度:2 用时:3h
写的 $O(q m^2 \sqrt n \log n)$ 的做法, 最后一个点稳定 1.046s . 预处理多项式的二的次幂就过了.
实际上, 若用到 $\sum m$ 为 $O(m)$ 级别的条件, 则可以消去 $O(\sqrt n)$ . 但当时感觉浪费了很多时间, 精神错乱之下没有想到这一做法.
## T2(c) [靶函数]
期望:33 实际:12 难度:5 用时:1.5h
把 $O(2^m)$ 的状态改成 $O(17 的拆分数)$ 的状态即可. 考场上估算拆分数认为是 $O(2^m)$ 级别.
对于一类求 庞大状态 简单转移 的期望问题, 考虑构造一个定义域较小的 势能函数 与 一个状态的势能, 使得当得知这个函数的点值后每个状态的势能容易计算, 且一次转移中 势能的期望变化与状态的期望变化一致, 则期望直接由势能给出.
## T3(d) [仙人掌上 Dp]
期望:30 实际:0 难度:3 用时:30min
没有时间写导致的. 难度主要集中在实现.
对于一些树上可做的搬到仙人掌上的问题, 考虑建立圆方树.
对于树上一个 $O(\sum_{x} \sum_{i \in Son_x} \min(m, nowsize_x) * \min(m, size_i))$ 的算法(带限制背包), 其均摊 $O(nm)$ . 具体证明可分类讨论 $nowsize_x$ 与 $m$ 的关系 及 $size_i$ 与 $m$ 的关系.
## 结算
T1 对于一个算法的复杂度计算错误, 并且不看模数就自信认为可以 NTT, 导致很快糊出一个优秀的假做法. 导致浪费时间心态变化精神错乱, 最终遗憾.
发现自己假了崩溃的时候, 做做别的题或者出去逛一圈清空脑子.
# 20240212 总结
## T1(nobody) [线段树]
期望:100 实际:100 难度:2 用时:2h
略.
## T2(thousand) [二分答案] [扫描线] [随机打乱]
期望:66 实际:0 难度:4 用时:2h
写了跟正解毫无联系的 $O(n^3\log^2 n)$ 做法.
由于精度误差被爆了.
对于一类求一个最小简单图形的问题, 考虑决定这个图形形状的特殊点(圆周上的点/三角形的顶点).
若一次二分会有 $O(n)$ 次独立的 Check, 则随机打乱后只需进行 $O(\log n)$ 次二分, 每次 $O(1)$ 次 Check.
## T3(christmas) [歌唱王国] [并查集] [搜索合法 Boarder]
期望:40 实际:15 难度:5 用时:1h
"数据与题面不符的, 以实际数据为准."
对于形如 $S$ 中至少出现一次 某个特定字符串 的方案数 Dp, 可以设 $f_i$ 与 $g_i$ 表示 $i$ 的前缀中恰好在结尾出现了这个字符串 与 没有出现这个字符串 的方案数.
其中包含了钦定的思想.
对于给定了若干组相等关系的序列计数问题, 使用并查集计算连通块数量.
若猜测某个集合很小但难以求出, 考虑一个每次转移较快的搜索. 可以从 如何判定某个元素是否在集合中 来推出 如何搜出这个集合.
## 结算
T1 的题面看的非常疑惑, 于是开始想 T2, 但第一步想错了方向, 没有回到最初的思路重新想.
对于看不太懂的题面, 多看几遍或手玩, 将题意形式化表述.
如果想了几步之后发现问题规约到一个简洁的难解问题, 考虑回退一步.
# 20240213 总结
## T1(string) [SAM] [线段树合并]
期望:100 实际:100 难度:3 用时:2h
一开始想的是对一个串求出它的最长 Boarder, 只能用 KMP.
事实上转换视角对于一个串求哪些串会以它作为 Boarder 之一更容易计算.
若枚举元素不好算答案, 就枚举答案反推元素.
在 SAM 上线段树合并维护 Endpos 好像还挺常见的, 之前好题宣讲讲过.
## T2(delete) [区间 DP] [拓扑序优化]
期望:80 实际:80 难度:3.5 用时:2h
对于一类转移保序的 Dp, 可以以 Dp 值为拓扑序, 类似最短路地转移(其实之前正睿也考过).
这里的保序是指, 较小的状态 所转移到的状态 都必然比 较大的状态 所转移到的状态 小.
## T3(rectangle) [容斥] [扫描线]
期望:20 实际:20 难度:4.5 用时:0.5h
想到了用 bitset 将 $O(n^3)$ 优化为 $O(\frac{n^3}{\omega})$, 但时间不够了.
也想过容斥, 但发现不会求三元环.
对于一类容斥问题, 想清楚自己可以限制什么, 对应的每项系数长什么样, 然后可以使用瞪眼法.
一般会把 "恰好" 容斥成 "至多/少" 或反向.
其中一类特殊的容斥问题是, 统计具有特殊性质的树形连通块(序列), 有 $点数 - 边数 = 1$, 则可以先统计点数次再统计边数次.
对于二维平面上的复杂偏序问题, 描述出需要统计的式子会方便思考.
~~想扫描线求度数的时候对着一张图想了很久, 下午对着一行式子马上糊出来了.~~
## 结算
开考 1h 后还没想出 T1(或者感觉自己没睡好神志不清), 这时可以先去把每道题的暴力都写了, 再回过头继续想.
# 20240215 总结
## T1(a) [矩阵快速幂] [矩乘优化]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(b) [扫描线] [分块] [定期重构]
期望:40 实际:20 难度:4 用时:3h
第一步就跟正解不一样, 且在 $O(n\sqrt n\log n)$ 的做法中使用了常数极大的 FHQ Treap 而不是 动态开点线段树, 导致跑不过朴素暴力.
对于一类 区间修改 单点查询历史值附带属性 的问题, 考虑离线用扫描线解决.
## T3(c) [颜色段均摊] [分治] [扫描线] [李超树]
期望:30 实际:0 难度:4.5 用时:1h
线段树维护值域最近点对时, 若存在两个相等的值, 答案忘记置 0.
若给定 $O(n)$ 个带权区间, 一个区间的权值是这些区间中被包含的那些的权的 min/max, 则所有区间构成 $O(n)$ 个相同权的矩形.
使用颜色段均摊容易求出.
对于 修改较多 查询较少 的问题, 考虑对于所修改的序列进行分治.
## 结算
似乎没有只能用 Treap 做的东西.
在 T2 上浪费了较多时间卡常与优化, 事实上优化了半小时后就应果断放弃而去拼 T2 部分分 和 思考 T3, 能够节省 1h.
# 20240216 总结
## T1(factory) [树形 Dp]
期望:50 实际:20 难度:3 用时:4h
$O(n^4)$ 正解没有调出来.
对于带权的方案数背包, 考虑将权带进状态中.
一棵树的拓扑序个数是 $\frac{n!}{\prod size}$.
对于一个多带一些限制的类似问题, 可以考虑规约到平凡问题并让方案带上相关信息.
## T2(magic) [网络流]
期望:5 实际:0 难度:4 用时:0.25h
大脑短路直接输出 $0$ 导致的, 事实上贪心显然.
对于数据范围在 $[10^2, 10^3]$ 范围的, 不存在 Dp 解法的最优化问题, 考虑最大流/最小割.
建模可以先根据所设的局面表示出答案再考虑.
若最后的式子不好建模, 考虑修改局面中部分变量的定义.
## T3(set) [莫队] [分块] [并查集]
期望:12 实际:8 难度:5 用时:0.25h
暴力求 mex 的时候枚举上界小了.
对于区间查询的元素出现性问题, 都可以使用 $p_{v, i}$ 表示 $i$ 之前第一个值为 $v$ 的位置等类似的东西来转化.
带修的主席树可以用分块变成 $O(\sqrt \frac{n}{\log n})$ 棵动态开点的线段树.
## 结算
死磕 T1 老毛病了(不是)
准备死磕之前先打好暴力.
# 20240218 总结
## T1(fst) [平分权值]
(没做出来) 用时:1.5h
对于一类 左侧每一项都相似, 右侧是一个常数 的不等式限制, 考虑将这个常数分摊到每一项中, 限制变为只与某一项相关的与 $0$ 的大小关系, 但是时间多个 $\log$.
## T2(game) [树上路径拆成两条] [FWT]
(做出来了) 用时:0.5h
略.
## T3(?) [生成函数]
(不会且一眼弃) 用时:0h
不会.
## 结算
vp 场.
T1 真的不一定比 T2 简单. 用时过于长之后要果断弃掉, 尤其是在没有好的思路时.
# 20240219 总结
## T1(why) [构造]
期望:100 实际:100 难度:1 用时:1.5h
略.
## T2(noip) [分类讨论] [斜率优化] [猫树分治]
期望:30 实际:0 难度:3.5 用时:2h
考场上糊了一个 $O(n^2)$ 假做法, 没写数据分治.
强调很多遍了, 把要求的式子列出来再考虑怎么维护.
图形有的时候不能涵盖所有情况.
区间查一个难以合并的东西可以离线下来猫树合并.
若强制在线但某一端点具有单调性, 可以使用二进制分组.
斜率优化在 x坐标单调性 与 下标单调性 不同时, 凸壳的方向与二分的方向要格外注意.
## T3(noforce) [深度和转子树和] [高斯消元] [中国剩余定理]
期望:40 实际:30 难度:5 用时:1h
转移方程的小错误, $i$ 不一定会转移到 $i + a_i$, 需要拿个数组记录.
求贡献时可以转换视角(如 20240111 T3 jigsaw).
若高斯消元时有一些项不是多项式, 考虑枚举不同情况来化简这些项, 并得到若干限制条件.
若要求很大的数又不想写高精, 可以用多个模数分别算出答案再用中国剩余定理.
~~事实上题解并没有看懂.~~
## 结算
最后 20min 用来想怎么把 T3 优化一个 $\log$, 但实际上想到了也不一定写得出.
正确的策略是把数据分治写了.
# 20240221 总结
## T1(isomorphism) [树同构] [Dinic二分图匹配]
期望:100 实际:100 难度:2 用时:2.5h
Dinic 跑二分图匹配的时间复杂度为 $O(m\sqrt n)$, 具体证明可以分类讨论增广轮数与 $\sqrt n$ 的关系.
树哈希可以用来解决树同构问题(虽然这次没有用到且考场上不会), 具体哈希式子为
$$ Hash_x = Size_x \times \sum_{i = 0}^{Son_x - 1} Hash_{Son_{x, i}} \times Prime^i $$
其中 $Prime$ 为一个质数常量. 特别地,
$$ Hash_x = Prime (x \in Leaf) $$
## T2(art) [贪心] [FFT]
期望:100 实际:70 难度:1 用时:2h
当值域为 $[10^9, 10^{18}]$ 级别时, FFT 需要使用 long double. 同时, FFT 数组需要开 $4$ 倍.
IDFT 所使用的矩阵, 其每个元素都与 DFT 矩阵的对应元素 **共轭** .
## T3(path) [点分治] [分类讨论] [可持久化带权李超线段树]
期望:0 实际:0 难度:4.5 用时:0h
并没有时间想.
对于一类路径不交的问题, 可以枚举分界点.
对于一类查询 $A \times F(x) + B \times G(y)$ 的问题, 其中 $A$ 与 $B$ 为定值, 考虑计算出 $F(x)$ 与 $G(y)$ 后维护凸包.
李超线段树的下标可以不连续(带权), 使用离散化即可.
## 结算
FFT 的板子没有背好, 共轭的那里调了 1h.
# 20240226 总结
## T1(dream) [容斥] [狄利克雷差分]
期望:60 实际:60 难度:2.5 用时:3h
难点在于不去想莫比乌斯反演.
该做法需要用到魔力筛 ($O(n)$ 计算 $g = \mu * f$).
想求 $Lcm$ 恰为 $i$ 的方案数一般会先求 $Lcm | i$ 的方案数.
想求 $Gcd$ 恰为 $i$ 的方案数一般会先求 $i | Gcd$ 的方案数.
求出前者后, 可以类似地求出 $Lcm$ 恰为 $i$ 且 $Gcd = 1$ 的方案数, 其中 $Gcd = 1$ 是一个很强的性质.
## T2(wind) [逆排列] [多项式卷积] [卢卡斯定理]
期望:70 实际:50 难度:3.5 用时:1h
这道题 $O(n^4)$ 可以过 $1000$, 但没开滚动数组导致跑不了 $n > 100$.
非对合排列可以与其逆排列一一对应, 其中对合排列为 $p_{p_i} = i$ 的排列.
在模 2 意义下对对合排列计数相当于对排列计数.
排列的逆序对个数与其逆排列的逆序对个数相等 ($i < j \space \land \space p_i > p_j \Rightarrow p_j < p_i \space \land \space j > i$).
前缀和可以看作乘以 $\dfrac{1}{1-x}$, 由此可以进行快速幂或交换律.
有卢卡斯定理:
$$ {n \choose m} \equiv {\lfloor \frac{n}{p} \rfloor \choose \lfloor \frac{m}{p} \rfloor} \times {n \bmod p \choose m \bmod p} \pmod p $$
由此, 有推论:
$$ {n \choose m} \equiv [n \And m = m] \pmod 2 $$
## T3(snow) [容斥] [观察力] [合同变换]
期望:15 实际:15 难度:4.5 用时:0.5h
对于一些比较简单的限制, 考虑合法状态与非法状态的关系, 并将限制容斥掉 (考虑非法状态的总数或与合法状态的和差).
对于一些复杂的贡献计算方式, 考虑分类讨论其贡献的组成部分以得到更多性质.
## 结算
T1 依然死磕一个想法.
对于每道题都尽量不让空间成为瓶颈.
T3 的特殊性质我全程在打表找规律而没有手推式子.
以后可以先推 10min 再考虑找规律.
# 20240227 总结
## T1(can) [找规律] [圆反演]
期望:80 实际:60 难度:2(卡知识点题) 用时:2h
脑抽忘记写另外的一个 Sub.
对于有一堆相切的平面几何题, 考虑用圆反演.
一个圆反演后还是圆, 但若其过反演圆的圆心, 会变成一条直线.
## T2(circle) [观察力] [主席树二分]
期望:30 实际:30 难度:3 用时:0.5h
对于一类有以前从来没见过的没有一点想法的问题, 考虑手造手玩一些样例.
对于区间内的与值相关的问题, 考虑主席树.
## T3(adventure) [最优化 Dp] [前缀/后缀 max 优化]
期望:64 实际:100 难度:2(n^4) 3.5(n^3) 用时:2h
$O(n^4)$ 的常数过小没被卡掉. 本地 3.3s OJ 0.4s.
极好的一道 Dp 题 (赞赏).
考场上没有将方程形式化描述, 导致思维比较混乱.
由于对于 收集型 Dp 的优化方法 多于 对于 扩散型 Dp 的优化方法, 对于一类 转移到的状态 与 当前状态和转移本身 之间不可逆 (下标带有 max/min 之类), 于是看似只能使用扩散型的 Dp, 考虑在枚举完 拓扑序对应维 之后立即枚举 转移, 并利用分类讨论使转移变得可逆, 同时得到一些对其他维度的限制. 这时由于转移可逆, 可以使用收集型来进行优化.
类似地, 对于一类转移数量极多但最优转移较少的 Dp, 显然需要利用某些方法求出这些最优转移再转移, 此时同样可以先枚举转移再枚举其他维, 得到一些对其他维的限制.
## 结算
写完一道题的代码之后, 再检查一遍有没有 Sub 忘记写了.
形式化描述一个局面或者一个方程是重要的.
# 20240228 总结
## T1(blocks) [线段树]
期望:40 实际:0 难度:3.5 用时:2h
枚举值域的循环上界错误地写了 $n$.
对于一类维护区间之间的相互关联的附带信息的数据结构, 考虑使用线段树.
线段树上维护区间之间的相交相离性, 考虑维护 $nt_i$ 表示有多少个区间跨过了 $[i, i + 1]$ 间的分界线.
对于线段树结点上一些进行区间操作会被推平, 但逆操作之后又需要还原的信息, 显然不能直接维护. 考虑分别维护推平前和推平后的信息, 合并左右儿子时分类讨论即可.
## T2(reset) [期望 Dp]
期望:20 实际:20 难度:4 用时:1h
对于一类转移与集合 $S$ 中的一个特殊元素 $x$ 有关, $S$ 中插入一个元素后 $x$ 的变化方便维护, 但若把当前 $x$ 删掉其变化唯一但不好维护的 Dp, 直接做必须维护整个集合. 考虑设计状态时钦定 $x$ 之后必须一直在集合中, 则终止状态会多出一个 $x$ 被删掉, 会多一个 Dp 数组, 转移时注意即可.
事实上, 此类 Dp 可以视作后继确定前驱唯一但未知的树上 Dp. 若其方程为线性组合的形式, 对于一个集合 $S$, 若其能转移到 $T$, 必然有 $f_T = f_S * k_T + b_T$. 将这个式子代入原来的 Dp 式子即可求出 $k_T$ 和 $b_T$ 的方程, 手解即可得到递推式. 对于一个 $T$, 还原出 $f_T$ 是容易的, 可以视作不断往根上跳, 同时维护对应项系数. 两种方法分别得到的两个 Dp 状态及方程是完全一样的.
## T3(triples) [贪心] [模拟网络流]
期望:20 实际:20 难度:4.5 用时:1.5h
对于一类最优化问题, 若其有显然的上下界, 考虑利用该界得到更多性质 (如 [U369223 集卡游戏](https://www.luogu.com.cn/training/393133#problems)).
模拟网络流一般会将网络流转化为最小割, 然后考虑一组解可能的形态.
## 结算
想 T1 的时候脑子非常混乱, 一直在想按左端点排序, 应该先把 T2 和 T3 的暴力写了再回来想的.
# HNOI 2024 总结
# Day1
## T1(wind) [解不等式]
期望:100 实际:100 难度:2 用时:2h
刚开始写代码的时候没意识到是解不等式, 浪费了很多时间. 对于代码实现中很多相似的问题, 考虑将其规约到同一个.
## T2(xor) [01 Trie] [贪心]
期望:40 实际:16 难度:3 用时:2h
冲正解没时间打部分分.
唯一没想到的是把加法操作改为删除操作. 以及对这个贪心的理解不够透彻.
对于一类贪心问题, 考虑其中某些特殊元素的决策情况 (如最小值最大的贪心, 考虑元素中最小值的决策).
分位贪心先判答案这一位能否为 $1$, 再讨论这一位的决策.
## T3(wormhole) [同构] [哈希] [Dp] [找规律] [Dp 方程转实际意义转 Dp 方程] & [解](https://www.luogu.com.cn/article/q2hc9n0u)
期望:32 实际:0 难度:5 用时:0.25h
冲 T2 没有想 T3, 事实上部分分是好想的.
对于 $p_{q_i} = q_{p_i}$ 的条件, 可以视为在 $p_{p_{q_{p_{q_{i}}}}}$ 或类似的东西中, 交换一对相邻的 $p$ 和 $q$ 不改变式子的值.
若需要将可能出现的种类极多, 判等较为困难的元素划分等价类, 考虑形式化表述出相等的条件并据此哈希, 有时需要先发现一些性质再进行映射.
对于方案数 Dp, 一种降低状态数的方式是寻找不同状态间的关系式.
对于一类较简洁的 Dp 方程, 若仅需其拓扑序最末尾的状态的对应属性, 考虑其的非本题的实际意义, 并考虑在拓扑序一维上从一次加 $1$ 变为加更多的转移方式.
# Day2
## T1(maze) [Dp] [贪心]
期望:100 实际:0 难度:2 用时:2.5h
线段树中《kMaxM * kMaxN * 56》. 1795MiB.
贪心时每次决策都要证明是否最优. 错误的贪心会浪费很多时间.
## T2(timeline) [DAG 计数] [拉格朗日插值]
期望:30 实际:30 难度:4.5 用时:1.5h
对于一类计数问题, 考虑如何判断两个方案是本质相同的.
若方案重排列不影响合法性但本质不同, 考虑不按排列而按集合 Dp. 此时状态要带上最后要乘的阶乘.
对于一类对 DAG 计数的问题, 考虑一个集合序列 $S$, $S_1$ 为 DAG 上入度为 $0$ 的点集, $S_2$ 为删去 $S_1$ 内的点后 DAG 上入度为 $0$ 的点集, 以此类推. 则 DAG 可以映射到集合序列上, 但 $\forall x \in S_i, \exist y \in S_{i - 1}$ 需满足有边 $(y, x) \space (i > 1)$. 发现这个条件不好满足, 考虑容斥. 钦定至少有 $S_i$ 内的点在删去 $S_1, S_2, ..., S_{i - 1}$ 后入度为 $0$, 条件变为 $\neg \space \exist x \in S_i, y \in S \setminus S_1 \setminus S_2 \setminus ... \setminus S_{i - 1}$ 使得存在边 $(y, x)$, 即 $\neg \space \exist x \in S_i, y \in S_1 \cup S_2 \cup ... \cup S_{i-1}$ 使得存在边 $(x, y)$, 容斥系数为 $(-1)^{|S_i + 1|}$.
对于一类转移为卷积形式的 Dp, 考虑维护 $[0,n]$ 的点值, 最后插值回来.
## T3(sleep) [不会]
期望:0 实际:0 难度:5 用时:0.25h
远超实力的题目.
## 结算
Day1 和 Day2 的考场策略出了同样问题, 每道题都应当留至少 1h 的思考和代码时间. 事实上, Day1 T3 的 32 分部分分对于排名来说很关键.
最后 10min 用来检查. 考前想好要检查什么.
- -fsanitize=address,undefined
- /bin/time 的时间与**空间**
- 调试信息 (Ctrl+F) 与文件读写 (最后测一遍样例)
# 20240330 总结
## T1(kanzenkankaku) [贪心]
期望:65 实际:50 难度:3.5 用时:2.5h
01 串的部分分没有写出来. $O(n^3)$ 的做法与正解没有一点关系.
对于一个暴力的枚举做法, 若时间复杂度已经很优 (如多项式级别), 考虑变换视角 (即更换枚举的东西) 使得最后一维可以用数据结构维护.
## T2(retribution) [观察力] [缩点]
期望:30 实际:30 难度:3 用时:1h
对于二维平面上的连通块相关问题, 考虑连通块的性质 (是否为一个矩形).
## T3(medrcy) [逻辑] [最小点覆盖]
期望:0 实际:0 难度:4 用时:1h
如之前强调的很多遍, 要将题意用式子形式化表达出来.
## 结算
T1 花费的时间太多了, 本应去想 T3 的. 30 min 没有进展时就应当换题.
# 20240401 总结
## T1([a](https://pjudge.ac/problem/21633)) [期望 Dp]
期望:0 实际:0 难度:4.5 用时:4.5h
事实上, 这道题与 20240228 T2(reset) 并不类似, 考场上以为是一样的做法. reset 的状态构成一棵树, 但这道题的状态构成一张 Dag (证明如 $\sum 3^{a_i}$ 单调递增), 且前驱有多个, 如: .
考虑从初始状态开始的若干特殊状态. 如 空/满且底部为 $x$/只有一个 $x$. 状态与转移可以围绕这些特殊状态设计.
## T2([b](https://loj.ac/p/3483)) [观察力]
期望:0 实际:0 难度:4.5 用时:0.25h
并没有开.
无向图上若从 $s$ 节点走 $i$ 步能到达 $x$, 则 $i+2$ 步同样也能到达 $x$. 故这一集合可以变成两个数 (奇偶最短路).
## T3([c](https://loj.ac/p/2468)) [不会]
期望:0 实际:0 难度:5 用时:0.25h
同样没有开.
## 结算
考试策略有问题. 事实上 T1 的 60pts 是好拿的, 可以有时间开后面的题.
T1 在知道正解后仍调了 3h. 需要加强期望 Dp 的实现.
# 20240402 总结
## T1([a](https://qoj.ac/contest/1057/problem/5171)) [平衡树优化 Dp]
期望:100 实际:100 难度:2 用时:2.5h
对于最优方案的方案数统计, 考虑求出最优化属性数组后用同样的方法计算. 可以少带一个最优化属性的维度.
## T2([b](https://contest-archive.loj.ac/contest/7/problem/2)) [树链剖分] [动态 Dp]
期望:23 实际:23 难度:4 用时:1.5h
降低复杂度的一种思路是, 考虑自己的几层枚举中有哪些受输入信息影响较少. 如枚举 $\ge x$ 的数显然比枚举实际方案与输入方案的 LCP 受影响更小.
树链剖分时, 若需要更新的附带属性与所有儿子都相关, 考虑根据 BFS 序开一颗线段树来维护.
## T3([c](https://uoj.ac/contest/64/problem/656)) [Trie 树] [差分] [哈希]
期望:7 实际:7 难度:4.5 用时:1h
对于一类字符串的拼接的匹配问题, 若不好转化成只会在某一个字符串内部或至多跨过一条边界的情况, 则仍需考虑暴力匹配并维护匹配到达的结点.
如 20230112 T4(奇妙能力歌), 一条 $S$ 从 Trie 树上结点 $x$ 出发的匹配路径可以被规约到深度更浅的 $y$ 出发的路径.
## 结算
考试的最后一个多小时脑子一直不清楚. 大概率是没有睡好.
# 20240403 总结
## T1([a](https://www.luogu.com.cn/problem/P9546)) [博弈论] [线段树]
期望:100 实际:100 难度:1 用时:1h
略.
## T2([b](https://loj.ac/p/4019)) [分治] [欧拉路径]
期望:60 实际:15 难度:2.5 用时:3.5h
流的建模出现了小问题. 对于一类需要有下界的网络流, 应当将流量设为下界, 并新建一个点来吸收上下界之间的流量. 而不是简单的将流量设为上界.
对于一个长为 $2^k$ 的序列, 优先考虑分治, 其次再是多项式与倍增.
分治的过程可以理解为将一个长为 $S$ 的序列变成了 $\log_2S$ 个长为 $2$ 的序列.
对于一类要求将一些元素分为大小相差不超过 $1$ 的两部分的问题, 使用网络流是愚蠢的. 使用欧拉路径是明智的.
## T3([c](https://loj.ac/p/4018)) [转化操作] [分类讨论]
期望:10 实际:0 难度:5 用时:0.5h
事实上, 防御力有可能降到 $0$, 因此循环的下界应是 $0$.
对于一类有固定攻击力与防御力的问题, 考虑将 己方攻击力 -= 对面防御力, 则攻击时无需考虑防御力的问题, 减防操作变成加攻击操作.
## 结算
事实上想 T2 Sub2 ($S = 2$) 时想到了欧拉路径, 但是并没有意识到可以在分治过程中同样使用. 当前面的 Sub 做法在后面没有任何用处时, 不妨回过头好好想想.
# 20240407 总结 & [解](https://www.luogu.com/article/ybti3sqj)
## T1([a](https://www.luogu.com.cn/problem/U415120)) [线段树] [扫描线]
期望:50 实际:50 难度:4 用时:1.5h
对于一类线段树上维护 值为某定值的位置数 的问题, 考虑该定值是否同时为可能取到的最小 (大) 值, 则可以维护 最小 (大) 值 与 数量.
## T2([b](https://www.luogu.com.cn/problem/U415121)) [计数 Dp] [容斥] [多项式]
期望:65 实际:65 难度:3 用时:2.5h
同 HNOI Day1 T3 (wormhole), Dp 方程列出来后可以考虑其的实际意义来优化.
**对于一个总和确定的序列, 本质不同的元素只有 $O(\sqrt n)$ 种. 远古时代会的东西现在不会了, 哈哈.**
[多项式取模](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
[多项式多点求值](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T3([c](https://www.luogu.com.cn/problem/U415119) 或 [月球车站](https://uoj.ac/problem/683)) [不会]
期望:30 实际:5 难度:5 用时:1h
分类讨论时漏了情况. 不收敛的情况判断错误.
对于一类分数需要取模且需要取 $\max$ 的问题, 若有关的数很小, 不用手写分数类而考虑同时维护 double 与 long long.
对于一类 DAG 博弈问题, 必胜点的后继中存在一个必败点, 必败点的后继全是必胜点, 否则是平局点. 从确定状态的非平局点开始 BFS, 队列里只放非平局点, 必胜点则判断每个前驱的后继是否都是必胜点, 必败点则将每个前驱设为必胜. 剩下的点都是平局点, 每个非平局点的步数为更新它的点的步数 + 1.
对于一类随机博弈的步数期望问题, 考虑最优博弈的决策与步数.
## 结算
~~总体上没有出现太大的失误, 但 T3 没有想到一个显然的技巧就开始写分数类有些不应当.~~
总体上出现了巨大的失误, 且 T2 没有想到一个显然的技巧极不应当, 贺知章一样.
# 20240408 总结
## T1([se](https://www.luogu.com.cn/problem/CF1610G)) [贪心] [Dp] [栈]
期望:30 实际:30 难度:1 用时:3h
若贪心想了超过 30min 且不确定是否一定是贪心, 继续想是愚蠢的. 即使对于总问题的 **部分** 情况有一定正确且优秀的做法.
若 Dp 的结果中只有最后一项会有用, 则可以只维护当前的 Dp 状态及对应的最优化属性. 用可持久化数据结构是愚蠢的.
若一个序列只用查后缀的信息, 弹出/插入 最后一个位置, 则可以用栈. 用线段树是愚蠢的. 用平衡树是更加愚蠢的.
综上, 在贪心中使用可持久化平衡树是极度愚蠢的. 尽管我仅仅是想了一个贪心做法与一个可持久化平衡树做法.
## T2([cover](https://www.luogu.com.cn/problem/CF1774G)) [奇偶分类] [区间包含关系] [倍增] [分讨]
期望:40 实际:40 难度:3 用时:1h
对于计数类似 奇数 - 偶数 的东西, 可以考虑一个元素是否有贡献来抵消. 同样可以考虑 LGV Lemma (因为里面有一个 $(-1)^{逆序对个数}$).
## T3([break](https://www.luogu.com.cn/problem/CF1842I) & [解](https://www.luogu.com.cn/api/team/downloadFile/x6u23kff)) [观察力] [分治]
期望:25 实际:25 难度:5 用时:1h
对于一类 $O(n^2)$ 状态 $O(1)$ 转移的方程, 考虑将其写成 $O(n)$ 状态 $O(n)$ 转移的形式. 即使原方程已经可以 $O(n \log n)$ 求, 后者也可能通过单调队列实现 $O(n)$.
对于一类环上问题, 若时间不允许断环成链, 则考虑随意断一条边然后调解.
调解的常用思路是考虑 两组最优解之间的关系/最优解与次优解的关系.
若有所有最优解的元素数量相等, 并且某一最优解的两元素中间有且仅有一个元素 (指数量而非特定元素) 会出现在其他最优解中. 可以考虑对最优解的第一个元素所在区间进行分治, 每次求出第一个元素固定为 mid 时的解, 则每个元素都能递归下去.
## 结算
吾有三罪:
- 先想贪心不想 Dp.
- 贪心找出所有需要的结论之后对于一个显然能 Dp 的问题 硬贪.
- 想到一个 $O(n^2)$ 做法之后无脑堆数据结构.
综上, 晚上要早睡.
# 20240409 总结
## T1([a](https://loj.ac/p/4139)) [Bitset] [倍增]
期望:30 实际:30 难度:3 用时:2h
思路与正解最偏离的一集. ~~容易转化为一个只能暴力求解的问题, 然后不会做.~~ 事实上大家都利用 ``bitset`` 将这个暴力求解的问题草过去了 (悲伤). ~~为什么我赛后还草不过去.~~
使用线段树合并/启发式合并时, 若一棵线段树/``set``会被多次合并 (即对其他多个线段树/``set``有贡献), 则复杂度是错的, 即使合并次数仍是常数. 原因是直到最后一次合并前线段树与``set``都需要复制, 会打破均摊的复杂度分析.
当想用 ``bitset`` 草题的时候, 通常空间的限制会紧于时间, 此时一种可行的策略是减少维护的状态量, 但是多做几遍 (如从 维护长度为 $n$ 的信息 & 做 $1$ 遍 变成 维护长度为 $16384$ 的信息 & 做 $\lceil\frac{n}{16384}\rceil$ 遍).
对于转化后的问题, 如果不好求解, 考虑回退一步 (如 20240119 T1 mulsign).
对于一个显然的做法, 考虑其错误 (算重) 的原因, 并尝试规避 (减) 掉.
如果一道题直接想复杂度正确的做法想不出, 考虑先想一个 **简单** 的复杂度较劣的做法. 此处的简单指可以容易形式化表述从而进行优化.
对于一类要对所有元素求相同附带属性的静态可合并 (或可分拆成多个可合并信息) 问题, 考虑使用倍增.
对于一类区间问题, 常用的两个思路是考虑左右端点能否分别处理 和 考虑具有包含/相交关系的两个区间之间的性质.
## T2([b](https://www.luogu.com.cn/problem/P9924)) [构造] [分讨]
期望:82 实际:82 难度:2 用时:2h
不难想到距离正解很近的做法.
对于一类限制了某些属性的上界的构造题, 考虑已有的构造方案在哪些情况下才会寄, 从而得到设计新方案时能用到的性质.
## T3([c](https://www.luogu.com.cn/problem/U416909)) [博弈论] [分讨]
期望:28 实际:44 难度:2.5 用时:1h
数据水了.
对于在一条链上有的结论, 务必将其扩展到树上.
对于博弈论中已经有了的必胜局面, 若 Sub 中每个都给了强烈的暗示, 则可以自信剩下的情况都必败.
## 结算
T1 卡了 45min 就去想 T2 了, 最会亡羊补牢的一集. 但应该更早的回退思路或直接开始想 ``bitset`` 做法.
# 20240427 总结
## T1(maze) [数学]
期望:60 实际:50 难度:3 用时:4h
形式化表述要求的东西. 对于一类求参数 $x$ 的最小值使得每个量 $f$ 都为整数的问题, 若每个 $f$ 都正比于 $x$, 则可以表示出 $x = 1$ 时每个 $f$ 的值并据此直接求得 $x$ 的式子.
令 $F_p(n)$ 表示 $n$ 中含有质数 $p$ 的幂数, 则 $F_p{n + m \choose n}$ 是 $p$ 进制下 $n + m$ 的进位次数.
<details>
<summary>Proof</summary>
$$F_p(n!) = \sum_{i \ge 1} \lfloor \frac{n}{p^i} \rfloor$$
$$F_p{n + m \choose n} = \sum_{i \ge 1} \lfloor \frac{n + m}{p^i} \rfloor - (\lfloor \frac{n}{p^i} \rfloor + \lfloor \frac{m}{p^i} \rfloor)$$
则第 $i$ 项只能取 $0$ 或 $1$, 取 $1$ 当且仅当第 $i - 1$ 位发生 向第 $i$ 位的进位.
</details>
当 $p = 2$ 时, 该值即为 PopCount$(n \oplus m \oplus (n + m))$ 或 PopCount$(n)$ + PopCount$(m)$ - PopCount$(n + m)$.
<details>
<summary>Proof</summary>
不进位加法与进位加法的差距 或 进位一次少一个 1.
</details>
可以用以下代码 $O(\log \log n)$ 求 PopCount. 思想为类似线段树的 Pushup.
<details>
<summary>Code</summary>
```c++
#define LL long long
int PopCount(LL x) {
const static unsigned LL w = -1, w0 = w / 3, w1 = w / 5;
const static unsigned LL w2 = w / 17, w3 = w / 257;
const static unsigned LL w4 = w / 65537, w5 = w / 4294967297;
x = (x & w0) + (x >> 1 & w0);
x = (x & w1) + (x >> 2 & w1);
x = (x & w2) + (x >> 4 & w2);
x = (x & w3) + (x >> 8 & w3);
x = (x & w4) + (x >> 16 & w4);
x = (x & w5) + (x >> 32 & w5);
return x;
}
```
</details>
## T2(city) [不会]
期望:0 实际:0 难度:5 用时:0.25h
## T3(color) [不会]
期望:0 实际:0 难度:5 用时:0.25h
## 结算
最后 30min 一定要把自己会的分拿完, 不要再冲正解. 不要被别人影响.
# 20240505 总结
## T1(party) [二分答案] [点分治]
期望:50 实际:50 难度:2 用时:3h
对于一类树上求距离一个点小于等于 $x$ 的点数, 考虑点分治. 其本质上是从一个点引出的 $n$ 条链.
## T2(string) [哈希] [后缀排序]
期望:60 实际:60 难度:3.5 用时:1h
对于字符间没有区分的字符串判等问题, 除 `将第一个出现的字符标 1, 第二个标 2 , 以此类推` 之外, 还可 `维护每个位置上一个同样字符的位置, 用这个数组的全等来判等`.
一个字符串的本质不同连续字串数量除几种经典的 Dp 以外, 还可由 $\frac{n(n+1)}{2} - \sum_{i = 1}^{n - 1} height_i$ 求得. 证明显然, 适用于动态且无法 DDP 的问题.
## T3(village) [观察力] [不会]
期望:5 实际:5 难度:4.5 用时:1h
一张混合图中为每条无向边定向, 保证总有方法最后得到一个 SCC, 则判断一条无向边能否朝一个方向连边的方式为 `钦定它是对应方向的有向边, 将其他无向边看作两条有向边后图是否是 SCC` .
## 结算
T1 经典想了一个显然错误的结论并进行了实现. 成功浪费 2h. 人类退化史.
真的要提升自己找反例与猜结论的能力了.
T2 考场上搓了一个跟后缀排序做的事情一模一样的 $O(n^2)$, 但是没有意识到是后缀排序. 或许以后的优化思路又多了考虑用已有算法替换一部分过程.
# 20240506 总结
## T1(soulist) [期望] [离散化]
期望:24 实际:16 难度:3.5 用时:2.5h
**我是傻逼.**
- `cout << Ask(l, r) << '\n'` 应为
`cout << Ask(l, r) % kMod << '\n'` .
- `if (n <= 19 && m <= 19 && 0) {` 应为
`if (n <= 19 && m <= 19) {` .
对于一类修改与查询都只与相对大小关系有关的期望问题, 考虑维护 $P(a_i < a_j)$. 事实上是一种另类的离散化, 因此时间复杂度不应与 $n$ 有关.
## T2(whiteqwq) [Ex GCD] [Ex CRT] [不会]
期望:12 实际:8 难度:5 用时:1.5h
没有写完, 但神秘地得了 8pts. 事实上, 输出 $n$ 有 20pts.
一类字符串匹配算法无需一定是相同匹配. 以 Manacher 为例, 只需满足回文内部一边有回文另一边对应位置也必然回文即可. Ex KMP 则只需满足等号有传递性即可. 事实上后者用的不多.
## T3(beautiful) [观察力] [分块打表] [Min_25 筛]
期望:60 实际:60 难度:2 用时:1h
求解一个前缀有多少质数可用 Min_25 筛.
打表时为缩短代码长度有如下技巧:
- 打表的内容尽量与要求的东西相接近以减少信息量.
例如, 要求前缀质数个数则打表区间质数个数比打表质数优.
- 分块使得散块的规模可直接暴力做从而减少存的内容.
- 将十进制改为更大的进制.
- 若每个元素都等长, 将数组改为字符串可以省去逗号.
- 代码长度通常为 100k.
## 结算
想 T1 的时间过于长了. 事实上这题并不是我能够初见切的题.
需要正确估计写剩下的暴力所需时间, 并计算出什么时候应当结束想题开始写暴力.
# 20240508 总结
## T1(moon) [放缩题意] [高斯消元] [反 Hall 块]
期望:45 实际:55 难度:4 用时:2.5h
数据水了. 事实上考场上我自己就造了一个 $n = 5$ 的 Hack.
对于一类 两组集合的并相等 的题目, 若不好满足则考虑将其放为 给每组中的每个集合赋正权, 对应元素的和全为 0.
求非完美匹配的二分图的任意一个连通块, 满足其不满足 Hall 定理, 则可以从一个非匹配点出发搜一棵交错树, 与根距离为奇数的点集为 $S$, 偶数为 $N(S)$.
由此, 对于题目给出的 类似 $n$ 与 $m$ 间的小于关系, 考虑建立二分图模型.
## T2(you) [数学]
期望:60 实际:70 难度:3 用时:1.5h
数据造错了.
考虑一种 "出题人意识", 若题目中给了 $\gcd(x, y, z) = 1$ 的限制, 大概率是解法依赖这个条件 (不然我加一个反演也不难) 而给我们提示.
做数学题有一种暴力的方法, 即将能换的元全部换了然后 $O{n \choose m}$ 枚举子集消元, 看有没有前途.
## T3(who) [椭圆曲线] [不会]
期望:20 实际:20 难度:5 用时:1h
在 $\bmod \space p \space (p \neq 2, p \in Prime)$ 意义下, 一个数 $x \in [1, p)$ 为二次剩余 (至少有一个数 $y \in [1, p)$ 使得 $y^2 \equiv x \pmod p$), 当且仅当 $x^{\frac{p - 1}{2}} = 1$, 且有且仅有 $y$ 与 $p - y$ 两个根.
事实上, 若忘记了这个定理, 判断一个数为二次剩余也可 $O(p)$ 预处理 $O(1)$ 判断.
## 结算
灵感浓度过高的一场 (虽然约等于只有两道题).
# 20240509 总结
## T1(pain) [搜索] [合并等价类] [狄利克雷卷积]
期望:22 实际:22 难度:2 用时:2h
如下代码:
```c++
for (int i = 1; i <= n; i++) {
for (int j = i + i; j <= n; j += i) {
f[j] -= f[i];
}
}
```
其本质上为将 $f$ 卷上 $\mu$.
事实上, $n$ 以内的本质不同 质因数分解的指数集合 是极少的, 当 $n = 10^{18}$ 时为 $10^4$ 量级.
## T2(silksong) [Meet-in-the-Middle] [随机化]
期望:100 实际:30 难度:2 用时:1.5h
没有看到有自环. 随机化写的太劣了.
随机化中加入随机调整会比纯随优很多.
## T3(pantheon) [生成函数] [不会]
期望:29 实际:11 难度:5 用时:1.5h
尚且不明的原因.
Dp 时, 优化的方法为 降低转移数(同时一般会增大状态数) 或 降低状态数(增大转移数).
## 结算
T2 想到正解但不够自信直到快下考才开始写. 好在写完了.
# 20240514 总结 & [解](https://www.luogu.com.cn/api/team/downloadFile/0h39kbn0)
## T1(tree) [BDFS 序] [树链剖分]
期望:25 实际:25 难度:4 用时:2h
[BDFS 序](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T2(snow) [观察力] [递归]
期望:30 实际:30 难度:4 用时:1.5h
对于不好描述合法条件的一类问题, 考虑采用递归的方式描述.
调试时, 若输入数据过大而不好调, 考虑简化输入使得仍然保留原来输入的性质.
## T3(halation) [观察力] [奇偶分类] [整体二分]
期望:45 实际:30 难度:4 用时:1h
数据分治写的不完全导致的.
看见有形如 $2^k$ 的式子且 $n$ 很大时, 考虑用奇偶分类将 $n$ 降为亚线性.
## 结算
数据分治还是要分开写. 使用 `if` 是不明智的.
# 20240515 总结
## T1(matrix) [最小割]
期望:100 实际:100 难度:1 用时:0.75h
最小割若要输出方案, 不能直接将边权为 0 的边当作被割的边, 但可以将边权非 0 的边当作未割的边. 原因显然.
## T2(card) [期望 Dp]
期望:100 实际:100 难度:2.5 用时:2h
20240507 讲题 讲过的东西. 具体为考虑一次有效的拿取物品. 此处略.
## T3(string) [01 串变换] [观察力]
期望:20 实际:20 难度:3 用时:2h
若对于一个 01 环, 每次将 01 变成 10, 则相当于 长度 $> 1$ 的 0 连续段每次向右移 1, 1 连续段左移 1, 相撞则均减 1.
## 结算
似乎发挥的还不错? T3 还不会, 暂且不做评价.
# 20240712 总结
## T1(ain) [包含特定子串的字符串数] [Border 等差数列]
期望:100 实际:100 难度:1 用时:1h
略.
## T2(ainsoph) [拆分贡献] [变换求和顺序] [含 0 逆元特殊处理]
期望:100 实际:100 难度:2.5 用时:2h
本来应当挂成 0 的, 数据水了.
注意到 0 没有逆元, 因此算区间连乘积时若可能出现值为 0 的项, 每个前缀应当记录 0 项的个数以及不考虑 0 项的积.
## T3(ainsophaur) [单位根反演] [式子转实际意义] [旋转坐标轴] [范德蒙德卷积]
期望:80 实际:80 难度:3.5 用时:1.5h
当一个式子长的很好看时, 考虑直接构造它的实际意义并改变计算的方法.
每次能朝四个方向走 1 单位不好处理, 可以通过旋转坐标轴 45° 并均偏移 $(1, 1)$, 即 $(x, y) \Rightarrow (\frac{x+y+1}{2}, \frac{y-x+1}{2})$ 来变成两维独立, 可以选择 $+1$ 或不变.
有如下式子 (即范德蒙德卷积)
$$\sum_{a+b=t} {x \choose a} {y \choose b} = {x+y \choose t}$$
可以用来拆形如 $\sum {n \choose a,b,c,d}$ 的东西.
## 结算
天胡开局. 但是依旧少考虑 Corner Case, 谨防 1795MiB 事故重演.
# 20240715 总结
## T1(aka) [拆分贡献] [二分图匹配]
期望:50 实际:40 难度:3 用时:4h
最小丑的一集, $O(2^n n^2)$ 没过 20. 想了 1h 发现看错题了, 再想 1h 想到了一个假做法成功浪费整场考试. 原本以为第一场考试会寄, 没想到是第二场.
对于一个元素的贡献有多种情况且情况能划分维度的问题, 考虑给每个维度赋恰当的权值使得合并后为元素本身的贡献. 事实上这点考场上应当想到的, 但因为受到错误题面的误导完全没有往这方面想.
用若干环覆盖所有元素相当于赋一个 $n$ 排列.
## T2(ao) [限制最优解形态]
期望:0 实际:0 难度:3.5 用时:0.25h
常见套路为, 当你要 删/加 某个元素时, 考虑在 头/尾 删/加 不劣的限制条件, 取反得到对最优解的限制.
一个连招为, 产生限制后用这个限制来缩减状态数量.
## T3(shiro) [李超线段树优化 Dp] [树套树]
期望:23 实际:0 难度:4.5 用时:0.25h
没有时间写朴素 Dp 导致的.
李超线段树不仅可以维护若干线段的单点最值, 事实上可以维护任意单调 (可既有增也有减) 函数 $f_i(x)$ 满足 $f_i(x)$ 与 $f_j(x)$ 只有至多一个交点.
李超线段树只能支持查询所有函数的最值, 若要查询 前缀/区间 的函数最值可以套上一个 树状数组/线段树.
动态开点李超线段树单次插入的空间花费是 $O(1)$ 的.
李超线段树上使用动态开点以扩大值域是愚蠢的. 可以直接离散化.
## 结算
成七的寄忆似乎准备复刻了. 看完题之后看样例输入, **且先不要看输出** (你的计算可能是错误的, 但看了答案后反推了过程), 算出全部答案后比对, 可以有效降低读错题的可能性.
每道题都要保证至少 0.75h 的思考时间, **且一般这也是上界**, 如果后面的题均很难则可以达到 1.25h.
# 20240717 总结
## T1(crops) [求特定转移可行性]
期望:100 实际:100 用时:1.5h
在最优化动态规划 $F$ 中若需要对每个阶段求出某一种转移的可行性, 则可以设同阶状态 $g$ 表示在该阶段内钦定其他状态都为极劣值时答案状态的值是否不变.
如树上最大带权独立集 Dp 中, 设有 $f_{i,0/1}$, 则 $g_{i,0}$ 表示钦定 $f_{i,1}$ 为 $-\infty$ 时 $f_{1,0}$ 是否不变. 转移显然.
## T2([miss](https://www.luogu.com.cn/problem/CF958C3)) [提取定量优化 Dp]
期望:0 实际:82 用时:1h
脑抽写了一个神秘做法, 甚至不满足拓扑序, 而通过了所有样例且获得了较高分数. 戏剧性的是没过的是一个前缀且暴力容易通过.
当 Dp 中存在 $a \bmod p$ 时考虑将其变为 $a - p \lfloor \frac{a}{p} \rfloor$, 从而将 $a$ 与 $p$ 提取出来成为全局量.
## T3(biophy) [推式子] [前缀和优化]
期望:100 实际:100 用时:1.5h
略. 注意推式子时想清楚每个部分代表的含义, 减少错误.
## 结算
对于一个做法先在脑内质疑并验证. 当时间有富余时 (事实上很难有) 拼暴力.
# 20240719 [HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1124) 总结 & [Account](https://www.luogu.com.cn/paste/o08ha6jb)
## T1(循环位移) [哈希]
状态:AC(-4) 难度:2
略.
## T2(星星) [小体积背包]
状态:AC(-2) 难度:1
暴力可过.
对于小体积背包, 暴力做 $O(nmV)$, 可以将每个物品 ``shuffle`` 后看作在背包容量一维上的随机游走, 则考虑完前 $i$ 个物品后期望容量为 $\frac{im}{n}$, 当只维护这周围 $\plusmn V \sqrt m$ 的背包容量时错误的概率约为 $10^{-4}$. 故可以做到 $O(nV \sqrt m)$.
## T3(树) [线段树合并]
状态:AC(-5) 难度:1
略.
## T4(传送) [线段树分治] [可撤销并查集]
状态:AC 难度:2.5
若使用 LCT 维护的最大生成树, 其边权不作为答案的一部分贡献, 则可以使用线段树分治套并查集.
## T5(博弈) [对称]
状态:WA 难度:3
当需要求一个元素大于另一个元素的概率时, 考虑交换这两个元素其概率是否不变.
## T6(序列立方) [转次方为指针]
状态:AC 难度:2
若一个等价类的贡献为大小的 $k$ 次方, 则相当于拿 $k$ 个指针扫同一个等价类的方案数.
## T7(三元环) [竞赛图三元环] [三维偏序]
状态:AC(-1) 难度:2
竞赛图三元环见前文同标签.
## T8(位运算) [无]
状态:AC 难度:1
略.
## T9(数位的关系) [数位 Dp]
状态:N/A 难度:2.5
难度主要体现在实现. 一般可以利用差分去掉下界, 然后额外设 0/1 表示前面 $i$ 位是否都顶到上界. 无需设初始值, 在循环内加上填第一个非 0 数的转移即可. 对于题目要求的量, 注意前导 0 是否能转移的问题.
## T10(众数) [随机数据]
状态:WA 难度:3
数据随机时, 每个区间的最大值都期望很大. 一般这种题可以直接写暴力然后稍微剪枝.
实现方面的细节, 若对 最大值恰为一个数 的区间数计数, 则容易从小到大使用并查集解决, 需要从大到小枚举时, 使用 ``priority_queue`` 按段内最大值 维护每个被之前的较大值切开的段. 需要预处理最大值出现位置.
## T11(树上的 mex) [二分答案] [链转平面点] [扫描线]
状态:N/A 难度:3
通过二分答案可以将求 mex 时的 $[0, k-1]$ 出现 $k$ 不出现转为 $[0, mid-1]$ 出现. 省去了不出现的要求.
当用若干条链将树拆分时, 不经过特定链的链在 dfn 坐标系中 形成若干个矩形, 所有链的矩形个数之和为 $O(n)$ 级别.
## T12(并) [合并贡献]
状态:AC 难度:2
当矩形数量为 $10^4$ 级别时, 考虑每个切出来的小块.
# 20240722 [HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1125) 总结 & [Account](https://www.luogu.com.cn/paste/o08ha6jb)
## T1(鸡爪) [贪心] [构造]
状态:AC 难度:2
略.
## T2(梦中的地牢战斗) [最短路]
状态:AC(-1) 难度:2.5
当一个最优化问题难以找到拓扑序时, 考虑用 Dp 值本身当作拓扑序.
## T3(绝对不简单的模拟魔方) [搜索] [模拟]
状态:AC(-1) 难度:2
当一个问题过于复杂时, 考虑其中不影响答案的量将其删去. 例如, 将三阶魔方换为二阶魔方不影响角上的块.
## T4(a*b problem) [min_25 筛]
状态:TLE 难度:4
暴力做法. 与正解只差 min_25 筛.
难点主要在学会 min_25 筛, 但我不会.
## T5(小塔的养成游戏之梦) [平面几何] [直线导出所有极小凸包]
状态:N/A 难度:4
难点主要在求出所有直线围成的所有极小凸包. 考虑将两端点夹的线拆成带方向的两条, 从任意未经过的一边开始走, 每次走到旋转角尽可能大的一条边上, 走一圈就是一个极小凸包.
## T6(传奇勇士小凯) [无]
状态:AC(-3) 难度:1
值得注意的是, 使用 ``pair`` 维护一个分数时, 若重定义了 $<$ 号, 在使用 ``max`` 函数时仍会用 ``pair`` 的默认比较函数来比较. 因此最好用一个 ``struct`` / ``class`` 维护分数.
## T7(URL 划分) [模拟]
状态:AC(-1) 难度:1
略.
## T8(成长, 生命, 幸福) [树上带点权直径]
状态:AC(-1) 难度:2.5
略.
## T9(强攻计策) [区间加 拆 后缀加减]
状态:WA 难度:4
做法假了.
当要维护的东西很庞大 ($O(n)$ 级别或差不多) 时, 考虑每次操作带来的变化量.
当区间加不好考虑 (会有两次变化) 时, 考虑将其拆分成 前/后 缀的加减 (只有一次变化).
一个支持 区间 加减 1 与 查询一个后缀最靠前的 0 的位置 的数据结构的实现方法: 分块. 块内排序二分可以做到块长为 $O(\sqrt {n \log n})$ 时 $O(q \sqrt {n \log n})$ (重构时可以归并做到 $O(B)$); 也可以在每个块内维护 $\plusmn \sqrt n$ 的最靠前位置 失效后重构, 当块长为 $\sqrt n$ 时可以做到 $O(q \sqrt n)$.
## T10(女神的睿智) [无]
状态:AC(-4) 难度:1
难点主要在正确理解题意.
## T11(在 A 里找有 C 的 B) [Trie 树] [KMP]
状态:AC 难度:2
判断模式串是否在多个匹配串中出现时, 若匹配串的长度之和可以接受, 则可以使用 KMP. $O(m + \sum n)$.
## T12(图计算) [并查集] [哈希]
状态:AC(-2) 难度:3
当需要判断若干组元素对应相等时, 考虑哈希.
当这些元素的值域不够大时, 可以为每个元素的取值赋一个权.
若哈希的方式为将其合并为一个大进制数的模数, 则底数 **一定要是质数**, 否则冲突几率极大.
# 20240724 总结
## T1(string) [交换求和符号] [KMP]
期望:100 实际:100 难度:2.5 用时:2.5h
看错题浪费了很长时间. 之后又被部分分误导没有往正确方向想.
统计进行一些操作后的字符串中的模式串出现次数, 若原串可能作为贡献的模式串很少, 则对每个模式串考虑将其保留下来的操作方案数.
## T2(game) [二分图博弈]
期望:20 实际:0 难度:4 用时:1h
最后十分钟赶的暴力, 连样例都来不及测, 挂了不足为奇.
判断合法转移的 ``s >> i & 1 ^ 1`` 写成了 ``s >> i & 1``, 初始集合的 ``1 << i`` 写成了 ``0``.
[二分图博弈](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T3(sequence) [贪心] [线性规划对偶]
期望:30 实际:30 难度:4.5 用时:1h
对于一个局面的多种转移, 考虑是否有一种转移始终不劣于其他转移. 若没有, 则不断添加限制条件来分类讨论.
当有两个对答案有益的量需要减少总共 $k$, 以当前状态难以决策时, 可以将这两个量均减去 $k$ (注意特判负数) 并在之后获得 $k$ 次免费使这两个量 +1 的机会.
[线性规划对偶](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## 结算
不要看错题. 部分分不一定通往正解, 当想了一段时间没有进展时及时回退.
快结束在打一道题较高的暴力时先将其他题的暴力打完.
# 20240726 [HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1126) 总结
## T1(深度自同构) [略]
状态:AC(-1) 难度:1
略.
## T2(旅行) [线段树合并]
状态:AC 难度:2.5
略.
## T3(游走) [模拟]
状态:AC(-8) 难度:3
傻逼恶心题.
## T4(游戏) [多项式]
状态:N/A 难度:4
[多项式快速幂](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T5(数论) [容斥] [Gcd 减半]
状态:N/A 难度:3.5
选取若干不交区间使得其中一个包含 $i$, 可容斥为在 $i-1$ 的前缀和在 $i+1$ 的后缀分别选取.
$\gcd$ 每次变化, 至少减半.
## T6(字符串) [字符串]
状态:N/A 难度:4
考虑一个母串 $S$ 中 $|Endpos|$ 相同的所有子串, 其左端点对于一个固定的右端点 $x$ 必然为一个区间 $[l, r]$, 且随 $x$ 的增大, $l$ 和 $r$ 都单调不降.
## T7(单峰序列) [线段树]
状态:AC(-3) 难度:2
维护一个区间内的数是否 单峰/上升/下降 这样依赖相邻两项数的信息, 考虑维护差分.
## T8(比特跳跃) [贪心]
状态:AC(-1) 难度:2.5
对于形如 $g_i = \min_j\{f_j + (i|j) \times k\}$ 的式子求值, 若 $k$ 为非负数, 则可以记 $h_i = \min_{j|i = i}\{f_j\}$, 有 $g_i = \min_{j|i = j}\{h_j + j \times k\}$. 若项数为 $2^n$, 则 $O(n2^n + 3^n)$.
## T9(圣芙蕾雅) [不会]
状态:N/A 难度:5
不会.
## T10(绘世之卷) [线段树分治] [根号分治]
状态:N/A 难度:4
维护较少元素两两之间的值的最值时, 若既有插入也有删除, 考虑使用线段树分治变成插入和撤销.
注意到, $\lfloor \frac{x}{y} \rfloor$ 与 $x \bmod y \space (x \ge y)$ 都是 $O(x-y)$ 级别的. 故当值域内有 $O(\sqrt V)$ 个数时, $\lfloor \frac{x}{y} \rfloor + x \bmod y \space$ 的最小值为 $O(\sqrt V)$ 级别.
## T11(抓拍) [三分]
状态:AC 难度:2
当需要求若干函数的和的最值, 但值不好动态维护时, 考虑函数的凸性.
## T12(死亡之组) [略]
状态:AC 难度:1
略.
# 20240729 [HDUACM (vp)](https://acm.hdu.edu.cn/contest/problems?cid=1127) 总结
## T1(超维攻坚) [三维凸包]
难度:3.5
难度主要集中在实现.
两个三维向量的叉乘即为这个面的法向量, 三点共线时叉乘为 0.
三个向量的行列式即为平行四面体的体积, 四点共面时行列式为 0.
## T2(黑白边游戏) [简化状态]
难度:3
对于编号不影响的有编号图, 考虑将其同构的缩成一个等价类从而压缩状态.
## T3(最优 k 子段) [二分答案] [贪心]
难度:3
求解最大子段和除了朴素的 Dp 外, 还能够枚举右端点维护左端点最小的前缀和.
当数据随机且题面中有质数的限制时, 考虑 Prime Gap = log.
## T4(分组) [Meet in the Middle] [前缀和优化]
难度:3
对于每个元素带权且贡献与权的最值有关, 考虑将所有元素按权排序. 此时下标与权单调, 则对于下标的取值范围的限制可以转化为对于权的最终取值添加一个上下界.
## T5(多层血条) [模拟]
难度:2
略.
## T6(延时操控) [简化状态]
难度:2
考虑一个状态的合法条件, 从而反向限制状态的范围. 事实上可以不用考虑, 使用记忆化搜索实现即可, 但强制需要写收集型.
## T7(序列更新) [根号分治]
难度:3
对于一类 checkmax 的操作, 考虑序列中的前 $B$ 大. 由于值是单调的, 同样可以考虑势能分析.
## T8(魔法卡牌) [搜索优化]
难度:4
对于一类 NPC 问题, 考虑简化状态并预先 Dp 出一类状态的时间复杂度上界, 每次取最优的转移. 如果上界过于大, 则多分几类讨论.
## T9(昵称检索) [略]
难度:1
值得一提的是, 将所有合法的月份+日期 (如 0715, 0229) 反着插入字典树, 那么得到的结点数恰好是 715.
## T10(矩阵的周期) [转化实际意义]
难度:3.5
一个 01 正方形矩阵可以视为邻接矩阵. 取若干次方就是走若干条边.
## T11(找环) [最小均值回路]
难度:3
[最小均值回路](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T12(寻找宝藏) [分类讨论] [扫描线]
难度:2
对于给定的限制较弱的情况 (即与无限制相比差距不大), 考虑直接分类讨论并使用类似无限制的方式解决.
# 20240802 [HDUACM (vp)](https://acm.hdu.edu.cn/contest/problems?cid=1128) 总结
## T1(数表 (二)) [观察力] [容斥]
难度:3.5
难点主要在于观察一个性质.
将所有数都异或上一个数不改变桶的集合, 且异或和的变化只与数的个数的奇偶性相关.
## T2(Array-Gift) [分类讨论]
难度:3
略.
## T3(捆绑魔方) [模拟] [搜索]
难度:nan
略.
## T4(树论 (一)) [支配对]
难度:3.5
$\text{Lcm}$ 不超过 $n$ 的数对个数只有 $O(n \log^2 n)$ 个. 证明如下
$$
\begin{aligned}
\sum_{i=1}^n \sum_{j=1}^n [\text{Lcm}(i,j) \le n] &= \sum_{d=1}^n \sum_{i=1}^{n/d} \sum_{j=1}^{n/d} [\text{Gcd}(i,j)=1][dij \le n]
\\
&=\sum_{k=1}^n \mu(k) \sum_{d=1}^n \sum_{i=1}^{n/dk} \sum_{j=1}^{n/dk} [dijk^2 \le n]
\\
&\le \sum_{k=1}^n \mu(k) \sum_{d=1}^n \sum_{i=1}^{n/dk} \lfloor \frac{n}{dik^2} \rfloor
\\
&\le n \sum_{k=1}^n \frac{\mu(k)}{k^2} \sum_{d=1}^n \frac{1}{d} \sum_{i=1}^{n/dk} \frac{1}{i}
\\
&\le n \log^2 n \sum_{k=1}^n \frac{\mu(k)}{k^2}
\\
&\le n \log^2 n \sum_{k=1}^n \frac{1}{k^2}
\\
&\le n \log^2 n \frac{\pi^2}{6}
\end{aligned}
$$
## T5(树论 (二)) [枚举 Gcd] [并查集]
难度:2.5
对于树上连通块覆盖问题, 可以反着做, 用并查集维护最深的未被覆盖的祖先. 注意到无需预处理 Lca, 可在途中暴力求得.
## T6(猫罐头游戏) [博弈论] [奇偶性]
难度:2.5
若当所有数都是偶数时不好考虑, 则可以将所有数都除去共有的 2 的幂.
## T7(猫咪军团) [观察力] [DSU On Tree]
难度:4
当操作影响的元素相互独立 (在本题中为所有的狗) 且可以无限次操作时, 不妨盯着其中一个元素直到被操作到合法. 显然不影响合法性且能将元素缩减到一个.
## T8(猫咪们狂欢) [最小割]
难度:3
若贡献的条件为若干条件的与的形式, 且要求贡献最大, 不妨认为初始拥有所有贡献, 将与转化为或, 要求代价最小. 随后可以容易最小割建模.
## T9(用心感受 (三)) [中国剩余定理] [杜教筛]
难度:4
若 $\mu(p) \neq 0$, 则 $a^{\phi(p)+1} \equiv a \pmod p$. 证明如考虑模 $p$ 的每个质因子, 然后中国剩余定理合并. 事实上打表不难发现这一规律.
## T10(世末农庄) [贪心] [二分]
难度:2
不要看漏了题目的条件. 如本题中看漏了 $p_u < p_v$, 认为需要树链剖分 + 堆.
## T11(开关灯) [观察力]
难度:1
打表不难找出规律. 事实上对于一类对每个元素的操作都一样, 但除了若干极少的位置不一样的题目, 考虑这些不一样的位置能如何相互配合以及与其他普通的配合.
## T12(串串) [基本子串结构]
难度:5
板子题但不会. 知识点见 [这篇博客](https://www.cnblogs.com/crashed/p/17382894.html).
## T13(飞行棋) [观察力]
难度:1.5
对于一类求概率/期望的题目, 考虑哪些状态的地位相同, 换言之考虑能否将某些状态划分在一个集合内, 使得集合内每个状态转移到集合外状态的概率均相等.
# 20240805 [HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1129) 总结
## T1(造花 简单版) [略]
状态:AC(-2) 难度:2
略.
## T2(造花 困难版) [必要条件交集]
状态:AC(-3) 难度:3
对于一类求哪些单点操作可以满足条件的题目, 考虑找到原始状态下不满足条件的极小单元, 从而得到一个集合, 必须操作其中之一, 然后将所有集合求交集.
## T3(飞车狂飙) [略]
状态:AC 难度:1
略.
## T4(不醒人室) [略]
状态:AC(-1) 难度:1
略.
## T5(交通管控) [略]
状态:AC 难度:1
略.
## T6(解方程) [Lenstra-Lenstra-Lovász 算法]
状态:N/A 难度:5
不会.
## T7(树上 MEX 问题) [拆 MEX] [Dp]
状态:AC 难度:2
所有集合的 MEX 之和 等于 包含 0 的集合个数 + 包含 0 和 1 的集合个数 + ...
## T8(树形 DNA) [哈希] [查询转修改]
状态:AC 难度:2
维护集合每次判若干固定元素是否全在集合中, 可以改成枚举每个固定元素找包含这个元素的集合.
## T9(数字加减) [计算上界]
状态:N/A 难度:4.5
对于一些操作对元素总数的修改很少, 且元素会自行减少的数据结构题, 考虑元素总数的上界.
对于一些无法简单维护的特殊情况 (如两个连续段连在一起需要合并) 且数量较少, 考虑将其当作一种操作并动态维护这种操作.
## T10(Rikka 与子集 IV) [多项式] [重链剖分] [矩阵乘法] [分治]
状态:N/A 难度:4
将轻儿子合并到重儿子的过程可以考虑用矩阵来表示, 从而能够方便地合并整条重链.
对于一类复杂度与二元都有关的合并算法, 从左到右依次合并显然不优, 考虑分治.
## T11(天天爱跑步) [分类讨论] [树形 Dp]
状态:AC(-1) 难度:3
略.
# 20240807 总结
## T1(sus) [倍增]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(usd) [扫描线] [线段树] [并查集]
期望:100 实际:100 难度:3 用时:2.5h
判断二分图除了直接染色, 还能够维护并查集. 事实上直接染色没有拓扑序, 需要快速判断时不常用.
当线段树需要 修改/查询 的不是一个区间, 但元素之间无序时, 考虑提前将元素排序.
## T3(pois) [Hall 定理] [最小割]
期望:30 实际:75 难度:4.5 用时:1.5h
数据造水了. 事实上, 按照 匹配边-非匹配边-匹配边-...-非匹配边 搜索得到的图是是一张一般有向图, 而不是无向图.
有个不应该的点在于送的 10pts 没有意识到.
当题目保证了完美匹配且需要满足一个等式时, 考虑 Hall 定理并 得到 补全另一个方向的条件.
Hall 定理可以反向, 即在有完美匹配的二分图中 $|S| \ge |M(S)|$, 其中 $|M(S)|$ 为另一侧与 $C_S$ 无边的点集.
可以通过给所有边都加上一个 $inf$ 的方式使最小割优先保证割的边数最少.
## 结算
T2 最开始没想清楚, 从手动染色到发现没有拓扑序再想到并查集花费了很久, 中途还实现了手动染色的代码.
对于一个代码预计花费较长 (> 1h) 的思路, 一定要验证可行性 (大概 5min).
# 20240809 [HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1130) 总结
## T1(纠缠点对) [树上差分] [线段树]
状态:N/A 难度:4
树上两条链有交, 则其中一个 LCA 在另一条链上.
链加 & 单点查可以转化为四次单点加 & 子树查.
## T2(生产机器) [判定条件转 Dp]
状态:AC 难度:2.5
略.
## T3(自动人偶) [AC 自动机上 Dp] [左右横跳]
状态:N/A 难度:4.5
$S^\infty$ 在 AC 自动机上与一个环对应. 证明显然.
[左右横跳](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T4(战争游戏) [博弈论]
状态:AC(-2) 难度:3.5
对于博弈论中参数较少 (一个或两个) 的题目, 考虑直接对参数进行分类讨论一些特殊的容易判定的情况. 然后考虑剩下的情况是否变得好考虑了.
## T5(Hold'em Shark) [大模拟]
状态:AC(-4) 难度:5
略.
## T6(怯战蜥蜴 II) [多项式] [交换求和符号]
状态:N/A 难度:3.5
差一点做出来了. 最后一步交换求和符号那里卡住了.
交换求和符号是极其重要的优化方式. 一定要会用.
## T7(创作乐曲) [删除无效转移]
状态:AC(-3) 难度:2
对于一个 Dp 方程, 考虑其是否有无效转移, 即若从 $j$ 转移到 $i$ 不如从 $j$ 转移到 $k$ 再转移到 $i$ 优, 则可以将 $j$ 舍弃.
## T8(循环图) [矩阵快速幂]
状态:AC(-1) 难度:2
略.
## T9(关于 agKc 实在不喜欢自动化于是啥都自己合成这件事) [略]
状态:AC(-1) 难度:1
略.
## T10(故障机器人想活下去) [二分答案]
状态:AC 难度:1
略.
## T11(蛋糕上的草莓是蛋糕的灵魂) [略]
状态:AC(-1) 难度:1
略.
## T12(华丽牧场) [贪心] [观察力]
状态:N/A 难度:4
见 [题解](https://www.luogu.com.cn/article/lc9tfr5v).
# 20240812 [打的稀碎的 HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1131) 总结
## T1(cats 的快乐 CF 刷题) [贪心] [单调栈] [线段树]
状态:N/A 难度:3.5
对于一类排列元素使得代价函数最大的题目, 若无限制时可直接将元素按某种方式排序得到答案, 那么在加入了树形拓扑序的限制 (多个栈内取元素 / 双端队列取元素) 后可以不断合并相邻逆序对 (对于线性的情况可以使用单调栈) 得到若干有序序列 (例如双端队列可以得到两个), 归并得到答案.
双端队列取元素问题可以转化成枚举分界点并归并两边的序列.
## T2(cats 的随机原神) [min/max 容斥] [神秘公式] [多项式多点求值]
状态:N/A 难度:4.5
对于一类求所有元素中第一个被减到 0 的期望用时, 考虑将其 min/max 容斥为求一个集合都被减到 0, 别的无所谓的期望用时.
一个神秘公式:
$$\sum_{i=0}^n (-1)^i {n \choose i} \frac{1}{m(i+t)+1} = \frac{\prod_{i=1}^n mi}{\prod_{i=0}^n (m(i+t)+1)}$$
<details><summary>Proof</summary>
> 考虑归纳证明. $n=0$ 时显然成立, 假设对于 $[0, n-1]$ 此结论成立.
>
> $$
\begin{aligned}
\sum_{i=0}^n (-1)^i {n \choose i} \frac{1}{m(i+t)+1} &= \sum_{i=0}^n (-1)^i ({n-1 \choose i} + {n-1 \choose i-1}) \frac{1}{m(i+t)+1}
\\
&= \sum_{i=0}^{n-1} (-1)^i {n-1 \choose i} \frac{1}{m(i+t)+1} - \sum_{i=0}^{n-1} (-1)^i {n-1 \choose i} \frac{1}{m(i+t+1)+1}
\\
&= \frac{\prod_{i=1}^{n-1} mi}{\prod_{i=0}^{n-1} (m(i+t)+1)} - \frac{\prod_{i=1}^{n-1} mi}{\prod_{i=0}^{n-1} (m(i+t+1)+1)}
\\
&= \frac{\prod_{i=1}^{n-1} mi}{\prod_{i=0}^{n-1} (m(i+t)+1)} - \frac{\prod_{i=1}^{n-1} mi}{\prod_{i=1}^n (m(i+t)+1)}
\\
&= \frac{\prod_{i=1}^n mi}{\prod_{i=0}^n (m(i+t)+1)}
\end{aligned}$$
</details>
## T3(cats 的飞机坠毁) [区间 Dp] [恰好转至多]
状态:AC 难度:3
略.
## T4(cats 的重力拼图) [分类讨论]
状态:AC(-1) 难度:1
略.
## T5(cats 的二分答案) [记忆化搜索]
状态:AC 难度:2
线段树上同一层内不同的区间长度至多只有两种. 故所有区间的长度只有 $O(\log n)$ 种. 故形如 $f_i = f_{\lfloor \frac{i}{2} \rfloor} + 2f_{\lceil \frac{i}{2} \rceil}$ 的 Dp 若只需查一个点值, 可以 $O(\log n)$ 解决.
## T6(cats 的最小生成树) [并查集]
状态:AC(-1) 难度:2
若有 $m$ 个并查集, 每次将最靠前的一个某两点没有合并的集合上的该两点合并, 则其满足单调性. 归纳证明不难.
## T7(cats 的 k-xor) [观察力]
状态:AC 难度:2
若在 $k$ 进制下的不进位加法中有 $a+b=c$, 则 $k \mid a+b-c$. 考虑最低位容易证明.
事实上, 对一个新东西挖掘性质的时候, 可以主动舍弃掉一些不那么优美的式子 (比如非最低位的限制条件) 而只考虑简洁的式子.
## T8(cats 的数据结构) [贪心]
状态:WA(-4) 难度:3.5
假了.
对于一类元素为二元组且限制条件形如偏序的题目, 在二维平面上考虑更方便.
## T9(cats 的凸包计算) [拆分贡献]
状态:N/A 难度:4
计算凸包面积的方式除了定一个点叉乘转一圈之外, 还可以是对凸包每条边算它投影到 $x$ 轴途中覆盖的有向面积大小并求和.
对于一类计数问题, 若每个元素不能取相同值, 取值范围存在偏序 (包含) 单调性, 则可以从小的考虑到大的直接乘.
## T10(cats 的集合 1) [And 转 Xor+Or] [势能分析]
状态:AC(-3) 难度:3.5
$a \operatorname{and} b = ((a \operatorname{xor} S) \operatorname{or} (b \operatorname{xor} S)) \operatorname{xor} S$.
## T11(cats 的集合 2) [数位 Dp]
状态:WA(-1) 难度:3
数位 Dp 的常用思路是 枚举 $[0,lg)$ 中最后一段顶到上界的数中顶到上界的长度, 在其中加入题目要求的 Dp.
## T12(cats 的电脑中毒) [贪心]
状态:AC 难度:3
对于状态数量些许大使得难以手玩的情况, 考虑删掉一些特殊的 没有贡献/不优 的状态从而使得剩下的状态带有特殊性.
# 20240814 总结
## T1(tree) [虚树] [搜索]
期望:100 实际:100 难度:2 用时:2h
对于一类元素极少时能够手玩但题目中元素仅仅是较少时, 一定不要考虑手玩而应当考虑暴力 枚举/搜索 所有情况.
## T2(wobinigao) [贪心]
期望:100 实际:100 难度:2 用时:2h
对于一类大多数情况会连着选若干个 (比如两个) 元素的情况, 考虑将相邻的若干个 (比如两个) 元素捆绑起来考虑.
## T3(game) [SG 函数] [矩阵乘法]
期望:60 实际:0 难度:3 用时:0.5h
搬题人题面搬错了, 乐.
对于一类使用矩阵快速幂解决的题目, 若途中需要乘 $m$ 次单个的转移矩阵, 且最终会用一个向量来乘以得到答案数组, 则可以预处理转移矩阵的 $2^k$ 次幂, 反着用向量不断乘转移矩阵. 时间复杂度从 $O(mn^3 \log t)$ 优化到 $O(n^3 \log t + mn^2 \log t)$.
## 结算
T1 愚蠢地尝试手动分类讨论, 浪费了一段时间.
T2 最开始看错题, 将答案的计算方式从最大值看成了总和, 导致使用了很多神秘的线性数据结构, 并在看对题后同样被错误思路带偏了一段时间.
# 20240816 [HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1132) 总结
## T1(树异或价值) [贪心] [Dp]
状态:AC 难度:2
略.
## T2(树上询问) [哈希] [点集直径]
状态:AC 难度:3.5
树上询问区间内点是否构成一条路径, 考虑维护区间最远点对并哈希. 换言之路径可以看作是一个特殊的连通块, 其直径恰为自身.
事实上找到深度最小和最大的点再二分出另一个端点也是可行的, 但麻烦.
## T3(黑洞合并) [无]
状态:AC 难度:1.5
略.
## T4(亡语) [模拟]
状态:AC(-2) 难度:3
难度主要集中在实现.
## T5(怪物猎人) [数论]
状态:AC(-2) 难度:2.5
对于一类下取整加整数的式子, 考虑将整数塞进下取整中以化简式子.
## T6(融合矿石) [背包]
状态:AC 难度:3.5
对于一类完全背包问题, 常见的操作是将物品按某种属性做完全背包得到若干新物品, 再对这些新物品按另一种属性做完全背包得到答案. 一般出现在物品的价值不是一种属性简单相加而与多种属性相关时.
## T7(小猫钓鱼) [博弈论]
状态:AC 难度:1
略.
## T8(最佳选手) [分类讨论] [图论转化] [并查集]
状态:N/A 难度:4
对于"两者只能取恰好其一"的限制, 考虑将其转化为图论问题.
当使用并查集维护元素时, 由于不能删除一条边, 在需要删除时可以考虑是否删与不删是等价的. 比如在删掉一条边后两个点又会同时连向另一个点, 则删不删等价.
## T9(长期素食) [凸包] [Dp]
状态:AC(-3) 难度:3.5
对于一类求若干直线在某一横坐标的前 $k$ 大值问题, 若 $k$ 很小 (本题为 3), 则考虑做 $k$ 个下凸壳, 做完一个把对应的边删掉, 则只需要查周围 $O(k^2)$ 条直线.
## T10(收集签名) [树形 Dp]
状态:N/A 难度:3.5
对于树形 Dp 的实现, 考虑额外贡献的分类讨论能否通过给 Dp 增加不会变劣的限制来简化. 如本题认为只能冲到叶子且只能走到一次, 则不需要额外贡献当且仅当每个叶子都被冲到, 而不用在 Dp 中额外设一维 01.
## T11(地牢谜题:更高还是更低) [递归]
状态:N/A 难度:4
对于一类具有单调性, 从而最优转移确定的 Dp, 其会退化为迭代. 此时不需要主席树, 倍增容易解决.
在实现上, 若一次操作途中可能引申出若干次同样的操作, 考虑使用递归.
## T12(地牢谜题:三个怪人) [不会]
状态:N/A 难度:5
不会.
# 20240818 [HDUACM](https://acm.hdu.edu.cn/contest/problems?cid=1133) 总结
## T1(LIS) [删除转增加] [费用流]
状态:N/A 难度:3.5
当所有元素的代价和一定时删除和添加能够互相转化.
数据规模较小且需要对每个 $i$ 都求出答案时, 若发现不好 Dp, 则大概率是费用流.
## T2(scenery) [Dp of Dp]
状态:AC(-2) 难度:2.5
当 01 Dp 在某一维 (某几维的线性组合) 上有单调性时, 可以减少这一维状态并改为 min/max Dp.
## T3(败北) [离散化] [逐个决策]
状态:N/A 难度:4
在计数问题中, 离散化的方式为将 Dp 状态的值域一维缩减到 $O(n)$ 级别, 并禁止空集的转移.
当一次的转移为一个集合时, 考虑能否通过给集合内元素定序 (可能需要额外增加状态的维度) 使得一个元素对原先集合和转移集合中在自己之前的部分的限制同质化, 且不会对在自己之后的部分产生限制.
## T4(轰炸) [双指针] [分块] [调和级数]
状态:N/A 难度:4.5
当计数问题的限制条件在所有维上单调时, 则只需要判断 $O(\max d_i)$ 次.
当问题涉及到使用一个大小固定的块来覆盖一些东西时, 可以考虑在某一维上以与块在这一维的投影长度相同的间隔选取一些关键点, 从而将东西分割为若干块并分别统计.
由于一般在这一维上的统计依赖于预处理结果, 该技巧仅限于多测; 并且由于复杂度是除一个不确定的数的形式, 优化的方向大概率是调和级数或根号分治.
## T5(套娃) [凸包与凸包的切点] [半平面交]
状态:N/A 难度:3.5
枚举大凸包的每条边, 找到小凸包上对应的切点, 则这些点为凸包间的切点. 事实上将凸包拆成若干条边的策略是常见的.
判断一组二元不等式是否有解可以利用半平面交求面积.
## T6(DuelForSun) [差分] [多项式多点求值]
状态:N/A 难度:3
差一点就想出来了.
对于一类需要对每个 $i$ 求若干阶乘的积的问题, 考虑将其差分从而只需求较少项的积.
当需要对每个 $i$ 求若干式子之积时, 将其化为元 $x$ 并展开多项式从而多点求值.
## T7(SunBoYi) [分类讨论]
状态:N/A 难度:4
难度主要体现在讨论的全面.
## T8(SunBian) [博弈论]
状态:AC 难度:1
对于博弈论的签到题, 只考虑打表 SG 函数. 观察性质需要的时间不确定.
## T9(不基本子串结构) [KMP]
状态:AC(-5) 难度:1
任何哈希都不要使用自然溢出.
对于串 $S$ 和串 $T$, 要求 $S$ 最长的后缀使得它也是 $T$ 的前缀, 则可以求 $TS$ 的 nt 数组.
## T10(A+B Problem) [分位考虑]
状态:AC 难度:2.5
当要求字典序最小的方案时, 留个心眼考虑是否只有较少的方案.
## T11(NOI2024) [贪心]
状态:AC(-1) 难度:1
略.
## T12(花环) [泛化题意]
状态:N/A 难度:4.5
当题目的描述过于复杂时, 考虑忽略掉一些信息来减少题目相关的元素数量, 但有时会增加其他元素的规模. 如本题中已经确定的置换环可以不考虑, 但 $b$ 数组会扩展到二维.
# 20240821 总结
## T1(checkin) [容斥] [插块法] [数位 Dp]
期望:20 实际:20 难度:4 用时:1.5h
对于一组分别有取值范围的元素, 若需统计其和不超过某个值的方案数, 则枚举超出上界的元素集合 并插块容斥.
当 $x + n \choose m$ 中的 $m$ 很小时, 可以将其拆为关于 $x$ 的 $m$ 次多项式, 从而可以对多个 $x$ 一并统计加和.
## T2(yyl) [观察力] [序列半和]
期望:20 实际:20 难度:4 用时:1.5h
深度最小的重心的子树大小必然严格大于点数的一半.
若序列上一个区间的和超过序列和的一半, 则其必然经过序列上的带权中点 (如 [U369223 集卡游戏](https://www.luogu.com.cn/training/393133#problems)).
对于题目中一些特别的限制, 满足去掉这个限制后得到的答案能容易地推导出满足限制的答案 (如本题找到的重心一定要是深度最小的, 但事实上找到任意一个后就能不断往上倍增跳) (又如 20240508 T2 you), 则其大概率为解题所必需的条件而非限制.
## T3(dfs) [匹配转链/环]
期望:45 实际:30 难度:4.5 用时:1.5h
暴力卡常没卡过去. 6s/5s.
对于两边点数相等的二分图, 将图中只保留对应点的虚边和匹配边, 则图中都为链或环 (完美匹配则全是环); 对于一般图将编号互为 xor 1 关系的点连虚边并保留匹配边, 则图中依旧都为链或环. 且此时对应点必然相邻, 故可以捆绑在一起从而使点数减半.
Dp 链的方式是, 按链中点编号最小值从大到小 Dp, 额外记一维 0/1 表示是否已出现比之前的集合的 lowbit 更小的编号. 因为有两个方向可以得到同样的链, 则初始化和每次换新链时系数为 $\frac{1}{2}$.
## 结算
精神状态不太好, 策略也有问题. 对于难度明显大的考试应在一道题上花费大部分时间以保证切掉一道题.
# 20240823 总结
## T1(game) [博弈论] [Dp]
期望:100 实际:100 难度:2 用时:1h
若博弈的基本元之间没有相互的影响, 但博弈非对称, 则可将所有基本元对博弈结果的贡献合并.
## T2(perm) [转化意义] [Dp]
期望:40 实际:40 难度:3.5 用时:2h
若对于所有二元组 $(x, y) \space (x < y)$ 组成的序列, 有 $(x, y)$ 必然在 $(x, z)$ 与 $(z, y)$ 之间, 则将二元组视为一次交换值为 $x$ 和 $y$ 的操作, 从一个升序序列开始操作, 必然满足每次交换的都是相邻的数, 且最终能得到降序序列.
对于与排列相关的 Dp, 直接枚举序数并转化为排列再转化回去需要 $O(n^2)$ 的时间, 但可以搜索全排列, 并维护每个数后面有多少个小于它 (具体地, 每次找到一个可用的数后就令这个值加一). 但操作后转化回去需要一定技巧.
## T3(seg) [二分答案] [贪心]
期望:40 实际:40 难度:4.5 用时:1.5h
对于一类需要二分答案的问题, 若要对多个类似问题的答案求和, 不好直接维护答案. 可以考虑维护转置后的函数 (即答案的估价函数), 将求和式子变形可以使得答案之和只与函数面积有关.
## 结算
一直在卡常, 忽略了有 30pts 的部分分是通过打表好拿的.
用 ``__int128_t`` 来存一个 $2^{46}$ 的数, 导致无法使用 ``unordered_map`` 而只能用 ``map``. 事实上手写哈希并优化常数就能过 T2.
# 20240825 [梦熊省选模拟](https://mna.wang/contest/1064) 总结 & [Account](https://www.luogu.com.cn/paste/hz6catpb)
## T1(super) [无]
期望:100 实际:100 难度:1 用时:1h
略.
## T2(genshin) [拆分贡献] [扩展状态] [DDp]
期望:15 实际:5 难度:4 用时:3.5h
最后一个前缀和优化没有来得及写完. 事实上整个思路是错误的.
对于求一个最外层为 $\sum$ 的式子的期望的问题, 首先将 $\sum$ 拆开. 事实上, 维护连续段的长度以计算平方要远难于枚举左右端点并令这个区间连续.
对于一类需要在 Dp 外层枚举一些东西的情况, 若枚举的东西只会对拓扑序一维以取值范围的形式产生影响, 则直接分类讨论取值范围并将 Dp 状态加一维用来存目前处于哪种情况. 正睿似乎考过这个套路.
对于一类只能用 Dp 求解, 但 $O(nq)$ 不可接受时, 考虑使用 DDp. **从而可以得出一个策略: 从较小的数据范围开始想, 但也要通过极限数据的范围来猜测正解的算法.**
## T3(honor) [不会]
期望:5 实际:5 难度:5 用时:0.5h
不会.
## 结算
事实上很多场考试思路大方向的错误都可以利用上述策略来规避. 但也要记得 ~~想到头晕~~ 很久没有进展时回退思路. 很多时候只要第一步走对了后面都不难.
# 20240828 总结
## T1(occur) [SAM] [分块] [DAG 链剖分]
期望:60 实际:60 难度:3 用时:2.5h
SAM 能够维护一个字符串 ``pop_front`` 和 ``push_back``, 但有时只有其中一种操作能同时维护答案. 此时分块的做法 (以只有 ``push_back`` 能维护答案为例) 为每个块区间都维护正串和反串的相关信息, 设 $L \le l \le mid \le R \le r$, 其中 $L$ 与 $R$ 为询问区间, $l$, $mid$ 与 $r$ 为块的间隙. 查正串表 $[l, mid]$ 并 ``push_back`` 到 $[l, R]$; 查反串表 $[l, r]$ 并 ``pop_front`` 到 $[l, R]$, 将答案置为正串的正确答案, 再 ``push_back`` 到 $[L, R]$.
[DAG 链剖分](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T2(include) [根号分治]
期望:10 实际:5 难度:3.5 用时:1h
手贱多写了一个数据分治, 成功没有过数据随机的 5pts.
对于一类询问区间内是否有一对元素满足条件的问题, 考虑对每个元素维护下一个满足条件的元素的位置.
总和一定时考虑根号分治!!!!!
根号分治时要分清两类元素, 数据结构中不能出现另一类元素. 实现上比较重要, 大部分调试时间都花在这里.
``set`` 常数远大于其他 STL, 需要使用的尽量少. 可以通过 ``priority_queue`` 来实现固定一点的 ``lower_bound``, 但这样操作的数量不能过多.
## T3(unsolved) [贪心]
期望:60 实际:28 难度:3 用时:1h
归并排序时忘记判对面是否为空了. 神奇的是 $10^7$ 的大样例都过了.
对于一类使贡献最小的贪心, 可以考虑什么情况下一定会有贡献, 并构造一种方案使得只有这些情况会贡献. 此时相比直接贪心统计答案, 统计一定会有贡献的情况数一般更容易.
## 结算
卡常所花费的时间不能超过 15min, 否则一般都是复杂度错误.
同时因为这一点没时间对拍导致挂分, 比较可惜.
# 20240830 总结
## T1([Tree Depth P](https://www.luogu.com.cn/problem/P5853)) [拆分贡献] [多项式]
难度:4 用时:2h(没切掉)
对于一类统计不同方案的深度和的问题, 不应考虑两个点成父子关系的条件, 而应当考虑成祖孙关系的条件.
值得一提的是一个与本题毫无关系的式子, 如果要将一个值域为 $[1, i]$ 和一个值域为 $[i+1, i+j]$ 的排列合并, 不考虑这两者内部的逆序对, 方案数关于新增逆序对数的 OGF 为
$$\frac{\prod_{x=1}^{i+j} (1-z^x)}{\prod_{x=1}^i (1-z^x) \prod_{x=1}^j (1-z^x)}$$
. 还挺好看.
## T2([Shuffle and Swap](https://www.luogu.com.cn/problem/AT_agc019_e)) [组合数学] [多项式]
难度:4 用时:3h(切掉了)
对于一类输入量较少 (本题输入量等价于 2 个整数) 的计数问题, 若不好直接 Dp 则可以考虑直接对于全局推式子, 然后再根据化简后的式子设计状态 Dp 或直接多项式.
## T3([Routing Schemes P](https://www.luogu.com.cn/problem/P7531)) [添加虚点] [Best 定理]
难度:5(卡知识点) 用时:0.5h(没切掉)
对于一类与若干条起点终点给定的路径有关的问题, 考虑添加一个虚点并向起点连边, 终点向虚点连边, 转化为若干个环.
[Best 定理](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## 结算
vp 场.
T1 第一步就错了, 在错误的方向上走了 2h. 再次证明了回退的重要性, 不过也有 vp 的因素在. 事实上 vp 让我一条路走到黑已经在 20240218 发生过一次了.
# 20240901 总结
## T1(polaris) [反向操作] [快速幂]
期望:100 实际:100 难度:1 用时:2h
为什么想到了偶数可以减半没有想到奇数可以减一再减半. 脑子坏掉了.jpg
## T2(caged) [Dp] [多项式] [求导]
期望:65 实际:45 难度:2.5 用时:2h
**血的教训**: 当多项式的值域为 $[0, n]$ 而非 $[0, n)$ 时, 做 NTT 的 $m$ 的循环的继续条件为 ``m <= n`` 而非 ``m < n``. 原因显然.
求导以快速幂并不仅限于那个神秘算法. 对于特定的多项式有特定的做法. 有时需要注意隐含的调和级数, 即当只关心结果的某一项且递推式中含有 $x$ 的若干次幂时, 上一个多项式需要递推的项数就能减少一部分.
对于一类序列 Dp 问题, 若直接按照序列 Dp 不好做, 可以按照值域从低到高地每次将最大的元素选取一部分加一, 但需要元素的贡献在值域上可递推且满足分配律 (如求和阶乘).
## T3(eternal) [支配区间] [笛卡尔树] [线段树]
期望:5 实际:5 难度:3.5 用时:0.5h
对于一类选取一个合法区间使得区间最大值最小的问题, 若区间的合法性随两端点单调, 则 $O(n^2)$ 个区间可被减少至笛卡尔树上的 $O(n)$ 个.
## T4(anfang) [字典树] [Dp]
期望:0 实际:0 难度:3.5 用时:0h
有时一个指针无法做需要两个指针的题, 真的用两个指针来考虑时会发现并不用更多指针. 故当没有更好的思路时 (尤其是这种愚蠢的异或题要么字典树要么线性基), 进一步思考是必要的.
## 结算
在 T1 上浪费了大量时间, 甚至没有一点紧迫感. 省选模拟赛打多了导致的. 需要认识到一点, NOIP 四道题 = 省选 三道题 + 1.
# 20240905 总结
## T1(jkp) [线段树]
期望:100 实际:100 难度:2.5 用时:1.5h
略. 听说实现有点难度.
## T2(sort) [贪心] [冒泡排序]
期望:100 实际:100 难度:2 用时:1h
对于一类通过将区间内数排序的操作构成特定序列的问题, 对一个区间排序可以被拆分为每次交换一个相邻的逆序对. 若操作数无穷则显然不劣. 进一步分析显然可以从左到右依次构造.
## T3(dba) [数位 Dp] [容斥] [插块]
期望:100 实际:100 难度:2.5 用时:0.5h
对于一类求若干相同范围变量组成某个范围的值的方案数的问题, 考虑容斥哪些变量超过了上界并使用插块法组合数计算. 事实上在 20240821 T1 使用过这个技巧.
## T4(banking) [重心] [树形 Dp] [换根 Dp]
期望:30 实际:0 难度:3.5 用时:1.5h
过于自信, 花了 1.25h 写一个明显难以实现的正解没调出来, 剩下时间写暴力挂了. 事实上既然写暴力了, 很多值可以每次重新计算 (比如删除一个子树后每个子树的权值和) 而不需要动态维护. 可以大大降低出错的概率.
对于一类与祖先有关的 Dp, 钦定不同的根会对复杂性产生较大影响. 可以将根钦定为某些具有特殊性质的与 Dp 相关的点 (如重心), 从而省去某些情况的讨论. 例如, 换根求排除子树的重心时, 若根不为全局重心, 重心会额外地可能在当前结点到根的路径上, 但当根为全局重心时只有从父亲继承并跳祖先的情况.
有时将倍增跳换成暴力跳反而能少一个 $\log$.
## 结算
~~这才是正宗的 NOIP 模拟赛.~~
即使在极度自信的情况下, 当正解代码过长时也应先写一个暴力. 不仅能提前得到一部分分数, 在正解需要调试时也有现成的 std.
# 20240909 总结
## T1(nene) [逆序对] [格路计数]
期望:100 实际:100 难度:2.5 用时:1.5h
一个排列的逆序对的下界为 $\sum_{i=1}^n |p_i - i|$, 当且仅当每次交换都产生新的逆序对时取等号.
对于一类计数排列的问题, 除去直接 Dp 外, 考虑将其直接映射成格路.
## T2([tks](https://www.luogu.com.cn/problem/P3573)) [分类讨论] [拓扑序]
期望:40 实际:0 难度:3.5 用时:2h
脑子有问题, 基于二分答案 + Dp 的做法写完假了对拍, 数据造的保证 1-n 为拓扑序, 然后暴力就没拓扑排序, 没调出来直接交了暴力.
当需要统计的答案只与每个单点或每条单边有关时, DAG 可以视为一个序列, 其每个点的位置为拓扑序的位置.
对于删除一个点的情况, 可以将其视为统计前缀与后缀组合的答案.
## T3(emu) [Dp] [状压]
期望:70 实际:70 难度:4 用时:0.5h
当在外层枚举某个量在内层 Dp 不好做时, 考虑将枚举的量放进 Dp 状态使得每次转移可以调用更多的值.
当 Dp 的转移出错且难以修正难以劣化状态时, 考虑出错的原因并对其分类讨论, 从而获得每个限制下的正确转移.
## T4([rui](https://qoj.ac/contest/1031/problem/5013)) [转化题意] [反悔贪心]
期望:65 实际:65 难度:4.5 用时:0.5h
对于一类判断条件, 若当子问题规模足够大时条件必定满足, 则可以对前面不满足的暴力计算, 后面满足的就能够更加简便地计算.
对于一类取一个子序列的问题, 若其限制与子序列的连续段有关, 则直接考虑原序列的连续段.
计算保留 $k$ 个元素的问题时, 若一个一个加入不好计算, 则考虑一个一个删除.
当一次操作的贡献不确定时 (如删一个连续段会让序列的连续段数减少多少, 有 012 三种可能), 考虑什么时候操作是不优的 (删两个相邻的), 将不优的操作排除掉, 枚举一些简单的情况 (两边删不删), 后再考虑现在贡献是否确定.
对于一类反悔贪心问题, 若一时无法想到一个合理的费用流建图, 可以考虑最优的一个元素, 分类讨论其选不选, 并利用限制得到不选时的一些性质, 从而唯一确定反悔带来的变化. 重要的一点是需要保证每次选一个元素都必须使 "流量" 恰好增加 1.
对于一类序列上相邻元素最多只能选一个的费用流建模, 考虑左部点为 $2i-1, 2i$ 的集合, 右部点为 $2i, 2i+1$ 的集合, 对应连边, 每条边流量均为 1, 即可保证限制.
## 结算
考试策略出了问题. 想了 2h T2 才看后面的两道题. 事实上先看 T3 大概率能切.
# 20240912 总结
## T1(square) [双指针]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(delete) [分配贡献] [容斥]
期望:70 实际:70 难度:2 用时:2h
当局面的终止条件为满足某个条件且该条件在操作序列上具有单调性时, 计数操作的数量可以枚举不满足条件和满足条件的局面的分界, 贡献为从初始局面变化到当前局面的方案数.
当求一类特定等价类的大小乘不满足限制的元素的个数的和时, 考虑将其容斥为全集减去满足限制的元素的个数, 从而将这个特殊元素的限制放进等价类的限制中, 无需前缀后缀拼接.
## T3(perm) [观察力] [线段树]
期望:10 实际:10 难度:3.5 用时:1h
将单峰序列的限制分配到每个元素身上, 则可以改写为 每个元素至多只有一侧含有比它大的数.
对于一类交换次数最小的问题, 考虑每个元素必须与哪些元素交换, 通常只需交换这些.
## T4(map 同 [Bánh Bò](https://www.luogu.com.cn/paste/8ldma22f)) [容斥] [Dp]
期望:8 实际:4 难度:5 用时:1h
在判断 $n \times m \le 20$ 时, 将 ``1LL * n * m <= 20`` 写为了 ``n * m <= 20``.
当对二维局面的两维都有限制时, 使用枚举细节并取幂次的方式只能解决一维的限制, 故需要通过分类讨论使得每个元素只有一种限制.
当一个元素的两种分类有交时, 考虑将其钦定进其中一种, 并在另一种中消除两种共有的元素产生的影响.
当将二维的限制等价转化为一维后, 应当考虑将一维的限制进一步推导出零维的性质. 如, 当 $n * m$ 的矩形有形如 每个 $p * q$ 的子矩形的和都相等的限制时, 显然的等价转化为每个 $\bmod \space p$ 等价的长度为 $q$ 的平行的行的和都相等 & 每个 $\bmod \space q$ 等价的长度为 $p$ 的平行的列的和都相等, 进一步得出 任意四个行 $\bmod \space p$ 列 $\bmod \space q$ 等价的排的像矩形的格子两个对角的和相等.
当有关二维平面的 Dp 需要在状态中维护两个方向的信息时, 考虑其中一种信息对最终答案的影响方式, 并将其乘进 Dp 的转移中, 以另一个方向为拓扑序.
``map<vector<int>, int>`` 的时间复杂度为 $O(\log n \times \text{Cmp})$, 故应当将 ``vector<int>`` 压缩成一个数.
## 结算
考试策略炸完了. T3 与 T4 都花费了 1h 而没有进展.
# 20240915 总结
## T1(wind) [二分] [单调队列]
期望:100 实际:90 难度:1 用时:0.5h
少判了二分到 $n+1$ 的情况, 此时 ``Calc(n+1)`` 的结果未定义, 应赋为极劣值, 但直接求得的是极优值.
略.
## T2(jadeite) [交换求和顺序] [等比数列求和]
期望:100 实际:66 难度:2 用时:2h
最后一步的交换求和符号卡住了, 认为需要计算自然数等幂和, 浪费了 1h, 然后急了, 放弃去想 T3 了. 怎么跟 20240809 T6 结局一样啊 (悲).
当等比数列的公比为 1 时, 使用 $\frac{1-x^{n+1}}{1-x}$ 将会得到 ``nan``, 需要特判.
答案式子有两个求和符号时一定要先考虑交换!!! 走投无路了再将其拆开!!! 😓
## T3(empty) [转化图论]
期望:55 实际:55 难度:3 用时:1.5h
若有多个序列, 且需要将一个序列拆成前缀和后缀来判断限制条件, 可以让前缀和后缀之间连边, 将限制条件转化为图论问题.
判断是否存在三/四元环可以让大度点向小度点连有向边, 时间复杂度 $O(\sum_i\sum_{j \in Out_i}|In_j| + |Out_j|)$, 根号分类讨论即可证明为 $O(m \sqrt m)$ 级别.
## T4(sinner) [贪心博弈] [DDp] [Treap]
期望:0 实际:0 难度:4.5 用时:0.5h
读错题了, 但事实上题面的确写的不好.
当一类博弈论的题目需要计算的不是先手必胜或必败, 而是某个式子最终的值时, 若无法使用类似 20240823 T1 的 Dp, 则可以大胆猜测最终的状态为某个较为简洁的形式, 可以通过造一些稍大的样例手玩来得到这一形式.
在证明满足某个条件的局面一定最优时, 可以考虑一个不满足条件的局面, 并考虑其是否存在一种方案 (操作方案/博弈策略) 调整到满足条件的局面, 且能变得更优.
``FHQ Treap`` 的删除某个值的其中一个点的写法应当是 ``Split`` 出只有这个值的树, 合并左右儿子.
调试时, 若代码中使用了 ``Rand``, 则应当重复测试同一组大数据, 看答案是否会发生变化.
## 结算
这场的失误难以归结为考试策略的问题. 事实上应当多回退思路, 以防止死磕在某个点上.
# 20240919 总结
## T1(sort) [贪心]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(monster) [二分答案] [最短路]
期望:100 实际:100 难度:2.5 用时:2h
对于一类有限制的最优化问题, 若限制单调但更劣, 除了考虑二分答案外, 也可考虑忽略限制的求解方式并每次通过取 $\max$ 或 $\min$ 的方式强行使其满足限制.
对于一类边权不全是 1 的可用 Dij 解决的最短路问题, 若最大的最短路的值域较小, 则可以用 $O(V)$ 个 ``vector`` 来模拟 ``priority_queue`` 以达到线性复杂度.
## T3(string) [manacher] [SAM]
期望:100 实际:60 难度:2 用时:1h
**多次调用的函数内, 定义 $O(n)$ 的数组需要使用 ``static``!**
给 SAM 上结点按 $len$ 排序时不要使用 ``vector``, 会使常数增加约 $15\%$.
## T4(mex) [观察力] [序列转值域] [区间包含] [线段树]
期望:30 实际:0 难度:3.5 用时:1h
写完莫队线段树发现没过大样例, 发现题意理解错了, 以为相等的时候只能 +1, 但事实上在这个暴力中两种题意的做法差别不大.
莫队有一个优化, 为偶数块内右端点升序排序, 奇数块内右端点降序排序, 这样右指针可以来回移动而不用每次清空.
当需要得到一个求解答案的更简洁的式子时, 考虑钦定答案为某个值并由此得到一些元素的限制, 从而反向推出.
对于一类只与值的集合有关的函数 ($\max$, $\min$, $\text{mex}$), 可以从值域上扫描线以同时对多个区间求解.
## 结算
最后 30min 写 T4 的时候过于着急了, 甚至记错了之前读的题意, 并尝试写一个完全无法做的分块数据结构, 好在改成线段树很快. 对自己的写暴力能力有过高的预估了, 应当先写区间 $\text{mex}$ 板子的.
# 20240922 总结
## T1(magic) [贪心]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(tree) [树形 Dp]
期望:50 实际:20 难度:2.5 用时:2.5h
$O(n^3)$ 被卡常力 (悲).
树形 Dp 的第二维状态的范围不应当局限与子树内. 事实上若 $O(n^2)$ 的做法足以通过, 则第二维的范围当然可以设为整棵树.
带权树上一个连通块内存在一个点到所有点的距离都不超过 $l$, 则必有一个点在直径上.
## T3(road) [最小生成树] [并查集]
期望:100 实际:100 难度:2 用时:0.5h
并查集对应连边的做法曾经考过, 但忘记在哪一场了.
## T4(seq) & [解](https://www.luogu.com.cn/paste/3bbmxaso) [分类讨论]
期望:36 实际:12 难度:5 用时:1h
``g[j] = g[j] * ((j + k) % 3 ? w[(j + k) % 3] : w[(j + k) % 3] + 1)`` 应为 ``g[j] = g[j] * ((j + k) % 3 ? w[k] : w[k] + 1)``.
当需要计数一个长度固定的不降序列个数, 若每个位置对 $\bmod \space p$ 有特殊要求, 则可以考虑差分并将每个位置补全至 $p$ 的倍数并插块.
## 结算
T2 的上述结论事实上在 1h 时就想到了, 但由于下午脑子不清楚以及突然发现树边带权而果断地不假思索地排除. 事实上排除一个想法前需要给出反例或能够证明.
看见 T3 的第一眼居然没有切, 做完 T2 的 $O(n^3)$ 才去做, 下次应当 **做完 T1 后给每道题都先思考一段时间**.
最后几分钟但有个小错误没调出来时一定不要慌张, 往往慌张就会导致无法看出明显的错误.
# 20240926 总结
## T1(travel) [贪心]
期望:100 实际:100 难度:2 用时:**2.5h**
为什么觉得只会额外经过一个点? 为什么觉得只会额外经过一个点? 为什么觉得只会额外经过一个点? 为什么觉得只会额外经过一个点? 为什么觉得只会额外经过一个点? 为什么觉得只会额外经过一个点?
树上若干路径的最小值相关的问题, 优先考虑直径, 其次最大生成树.
## T2(floor) [打表] [高斯消元] [搜索]
期望:45 实际:45 难度:2 用时:1h
对于一类输入参数较少且答案明显是较低次数的多项式形式时, 考虑打表并高斯消元求解系数. 事实上考场上想到了但由于时间紧迫且从未写过, 并没有写.
当可能的状态数很少时, 考虑直接搜出所有的状态而不要手动分类讨论.
## T3(mex) [根号分治] [序列转值域]
期望:50 实际:55 难度:4 用时:1h
当贡献需要在二维平面上计算, 且可以分别以这两维为拓扑序 Dp 时, 考虑根号分治.
对于 $\text{mex}$ 这类与值的集合有关的函数, 在值域上扫描线是极常用的手段, 如 20240919 T4.
在形如 ``a >> b`` 的式子中, 若 ``a`` 与 ``b`` 至少有一个为整型变量, 则 ``a >> b`` 的值与 ``a >> (b % 32)`` 相等. 因此, 当 ``a = 4``, ``b = 34`` 时 ``a >> b`` 的值为 1. 在判断集合是否包含某个元素时会导致问题, 需要额外判断 ``b < 32``.
## T4(rectangle) [容斥] [扫描线]
期望:15 实际:15 难度:3.5 用时:0.5h
20240213 T3, 但没有时间实现了.
求解形如多少个区间与某个区间有交的问题时, 有交的判断条件较为复杂需要分类讨论, 则考虑容斥成无交. 推广到二维同样适用, 为 $n - 1 - 上下左右的矩形个数 + 四个角的个数$.
## 结算
打的最稀烂的一场. 浪费了至少 2h, 且少拿了 55 pts. 浪费的 2h 继而导致了没有时间思考 T3 或实现 T4, 事实上 T3 多拿一些部分分是不难的.
1.5h 没想出 T1 后放弃, 后回来继续想不难想到了 Boruvka 神秘做法. 陷入死局后换脑子是极其必要的, 虽然那个神秘做法并不优秀.
# 20241005 总结
## T1(merchant) [二分答案]
期望:100 实际:90 难度:1.5 用时:**1.5h**
错误的使用了 ``sort`` 而非 ``nth_element`` 导致复杂度多一个 $\log$.
考虑一类最优化问题的答案函数形状时, 不应直接比较相邻两个位置的函数值, 而应考虑一组方案的答案函数形状, 总的答案函数为所有方案的 $\max$. 如当一组方案的答案函数为一次函数时, 总答案函数具有凸性.
需要 $O(n)$ 地查找序列前 $k$ 大, 可以使用 ``nth_element()``. 其实现原理为快速排序, 但每次只递归一侧, 期望复杂度 $O(n)$.
## T2(end) [贪心] [康托展开]
期望:100 实际:60 难度:2 用时:1h
将 $t$ 组询问离线, 题中给出 $t \le 10^5$ 但数据中 $t \le 2 \times 10^5$. 我要报警! ! ! ! !
$n!$ 的因数个数是极少的, $n = 40$ 时为 $6 \times 10^6$, 指数级增长.
对于特殊进制, 每一位位权为 $w_i$, 只需保证 $w_i \mid w_{i+1}$, 则第 $i$ 位上的数字至多为 $\frac{w_{i+1}}{w_i} - 1$, 且此时每个数都有且仅有唯一的分解方式. 因此康托展开的位权不需要一定有 $w_i = i!$, 也可是 $w_i = \frac{n!}{(n-i+1)!}$ 等.
## T3(end0) [观察力] [反悔贪心]
期望:100 实际:60 难度:3 用时:1h
想到了做法, 但是没有时间实现了.
对于一类操作序列并与目标序列匹配的问题, 若原序列无规律但目标序列有较好的性质, 则可以将操作原序列改为操作目标序列.
对于一类将序列操作 $k$ 次以内的最优化问题, 考虑最终序列的形态并由此得出每次操作的限制即性质, 如 $k$ 个操作区间不交.
## T4(shootluo) [贪心] [重链剖分] [换根]
期望:20 实际:20 难度:4 用时:0.5h
求和带权的深度和可以转化为求和子树的权值和. 事实上是将每个点的贡献放在每条边上.
树上选择一个连通块的问题, 若只关心连通块的度数且答案随树上拓扑序单调, 可将父亲绑在最优的儿子上, 即进行链剖分.
若需要插入删除并查询前 $k = \text{Const}$ 大的无序组合可合并函数, 线段树需要离线离散化, 平衡树常数大, 可以使用对顶堆 (4 个 ``priorith_queue`` /qiang).
## 结算
T1 用时过长导致没有时间实现 T3. 事实上在前 10min 就想到了二分答案, 但由于思考的视角不对并没有证明, 后思路偏离了较长时间. 放弃一个想法前应当多穷尽一些可能性.
# 20241006 总结
## T1(string) [无]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(forward) [容斥] [矩阵乘法]
期望:50 实际:50 难度:2 用时:**2h**
显然的矩阵乘法优化转移 Dp, 且列出了初步的 Dp 方程, 但由于直接思考了转移矩阵的形态并没有去优化这个方程. 别跳步骤或是想当然.
矩阵乘法优化 Dp 的基础始终是 Dp 方程, 图论中邻接矩阵的若干次方只是初始向量为全 1 的特例.
矩阵乘法卡常技巧: 当矩阵尺寸较大时, 将靠后的矩阵转置再枚举可以使内存访问连续; 使用 ``unsigned long long`` 并循环展开 16 项可以大幅减少取模次数.
## T3(grouping) [并查集] [Dp]
期望:50 实际:35 难度:3 用时:1h
全是环的情况没有写完, 且最初的想法有部分错误.
若当 ``check`` 成功后可以得知某些操作是最优/必需的从而直接执行, 则不妨考虑失败后是否也可以得知某些操作是最优/必需的, 从而利用势能分析来减少 ``check`` 的次数. 换言之, 将已考虑完的情况作为条件一同进行推论.
对于一类背包 Dp, 若只查询最终某种价值能否被组成, 且需要支持动态地插入删除, 则可以将 0/1 Dp 改为方案数 Dp, 并选取一个大质数 $P$ ($10^{17}$ 级别) 作为模数, 设方案数上界为 $V$, 查询次数为 $q$, 则错误概率为 $\frac{q \log_{P} V \ln P}{P}$.
## T4(path) [分类讨论] [观察力]
期望:50 实际:50 难度:3 用时:0.5h
树上一点到固定两点的距离的最小值, 其取两侧的分界线恰为这两点链的中点. 更广泛地说, 引入更多元素 (一点到固定两点路径的交点) 来得到新元素的性质从而反向限制原元素.
对于形如是否存在一点满足条件的查询, 考虑将该点需满足的条件变形 (此前或许需要缩小该点的选取范围, 如树上所有点 -> 直径) 使得分别与该点和查询的点相关, 从而可以离线处理.
## 结算
打的稀烂. 感觉智力回到了两年前, 基础过差导致的.
每道题的思考都停留在了较浅层面, 事实上有 10-20 pts 都是在经过稍进一步思考后容易拿到的.
较简单的题目, 得到中等分后需要回退思路的可能性会极低, 一般可以继续往下想.
# 20241010 总结
## T1(sort) [观察力]
期望:100 实际:100 难度:2 用时:1h
当题目给出了奇怪的操作/代码时, 把它实现出来然后随便扔点数据进去观察.
## T2(game) [树形 Dp] [换根]
期望:100 实际:100 难度:2.5 用时:2h
当一类 Dp 问题有多组询问时, 若无法 DDp, 则考虑对所有可能的询问均求出答案. 如对树上每个点都询问则可以换根 Dp.
## T3(length) [交换 max 符号] [枚举转状态]
期望:80 实际:80 难度:3 用时:1h
当 Dp 的外层需要枚举一些东西时, 考虑 Dp 的哪些部分与枚举的东西有关. 若枚举仅用来判断能否转移, 则可以省去枚举并扩展状态. 如 20240825 T2.
对于一类树上连通块有关的 Dp, 若以点作为状态难以转移需要分讨 (如要求两点的链间挂的子树大小), 则可以将点改为边.
## T4(median) [压缩值域] [自然数等幂和]
期望:12 实际:4 难度:4 用时:0.5h
暴力搜索序列时, 若 ``a[x] == -1`` 则依次为 ``a[x]`` 赋上 $[0,m)$ 的值, 但回溯时没有将 ``a[x]`` 重新赋回 ``-1``. 事实上显然可以多开一个数组记录枚举的值.
对于一类只有比较, 交换, 递归, 返回某个参数的函数 (特别地, 排序与中位数), 若只需知道结果与某个数的大小关系, 则可将 < 设为 -1, = 设为 0, > 设为 1, 从而使值域只有 3.
对于较低幂次的自然数等幂和问题, 若幂次为 $p$, 则其为关于 $n$ 的 $p+1$ 次多项式, 通过拉格朗日插值可以做到 $O(p^2)$. 显然, 这并不局限于 $\sum_{i=0}^n G(i) = i^p$, 对于任意 $p$ 次多项式 $G$ 都是可行的.
## 结算
策略并无较大的错误. 有时暴力不应写的过于简洁, 容易产生意料之外的错误.
# 20241013 总结
## T1(a) [容斥]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(b) [无]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T3(c) [双指针] [分类讨论]
期望:100 实际:52 难度:3 用时:**3h**
加个双指针优化就过了.
能够用一维表示的状态不要使用二维来实现, 容易导致难以观察出显然的单调性或优化方法.
若操作次数的上界较小, 且每个位置的操作次数大体成递增趋势, 则可以用调和级数来优化.
对于一类序列上单调递增的条件, 考虑将其分为前后两部分, 前面小于某个阈值, 后面大于这个阈值, 从而前面的获得更少的状态数, 后面的转移遵循某种性质.
## T4(d) [树形 Dp] [三分]
期望:24 实际:0 难度:3 用时:0.5h
首先写了一个暴力维护凸包的较高分暴力, 写挂后写最低暴力, 而差 1min 写完. 对自身实现能力的了解不够而导致过于贪心.
Slope Trick 可以带权.
对于一类凸性 Dp 的转移, 若其中含有取前缀 $\max$ 一步, 则最高点后的所有值都是确定的, 期望只会往下查 $O(1)$ 次, 则可以只维护最高点的决策及其取值. 一种复杂度不正确的乱搞做法.
## 结算
策略出现了失误. 写完 T3 后花费了 1h 在调参与优化实现上, 应当先拿到 T4 的较高暴力分再来优化, 而事实上这优化的 1h 并没有得到任何更多的分数.
不过今天状态不好也是一方面, 现在还在头晕.
# 20241015 (补 20241004) 总结
## T1(alive) [Meet-in-the-Middle]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(aspect) [排列 Dp]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T3(oneness) [观察力] [预处理答案]
期望:80 实际:100 难度:3 用时:**2.5h**
认为答案不超过 $O(\sqrt n)$, 但显然是错误的.
对于一类每次可以加 $[l, r]$ 内任意一个整数的背包, 加 $k$ 次后能够组出的值域为 $[kl, kr]$ 内的每一个整数. 则 $v$ 若满足 $\lceil \frac{v}{r} \rceil \le \lfloor \frac{v}{l} \rfloor$, 加的最小次数为 $\lceil \frac{v}{r} \rceil$; 否则无法组出.
对于 $n$ 个点组成的若干连通块, 考虑一个连通块内的复杂度上界能否从与 $n$ 有关变为与 $size$ 有关.
对于多次询问的问题, 若两个特定的询问间存在递推关系, 且询问总数可以接受, 则可以将预处理所有答案.
## T4(proud) [观察力] [调和级数] [并查集]
期望:64 实际:20 难度:3.5 用时:1h
$O(n^2)$ Dp 的初始值设置错误, $f_{i,i}$ 应为 $\min_{j=0}^{i-1} \{f_{i,j}+1\}$ 而非 $i+1$, 从而线段树优化 Dp 也是错误的. 对于有先后顺序的不同操作应当分步转移, 如添加当前位的字符和复制当前前缀.
当可以进行两种操作且第二种操作没有限制, 能进行第一种时进行第一种一定更优时, 可以贪心地进行操作.
对于一类复制整串并在后面某个位置粘贴的操作, 前缀 $i$ 粘贴的次数至多为 $O(\frac{n}{i})$ 次, 则可以调和级数.
当前缀的长度一定时, 判断某个区间是否等于这个前缀, 应当使用 $\text{len}$ 数组在区间头判断而非 $\text{nt}$ 数组在区间尾判断.
只会合并 $i$ 与 $i+1$ 的并查集时间复杂度为均摊 $O(1)$ 的. 证明考虑设势能为每棵树的最大深度之和 (此时树的形态是一条链挂一堆点).
## 结算
T3 思考根号分治花费了 1h, 而没有尝试确定一个更紧的复杂度上界.
明智的一点是在 T3 的最后 20pts 还不会时先去将 T4 的部分分写了. 事实上到下考也不会 T3 的正解.
# 20241017 总结
## T1(tree) [插入法计数]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(matrix) [贪心]
期望:100 实际:100 难度:1 用时:1h
对于长度固定的不限次数的操作, 考虑其能否构成一种平移操作并将所有位置平移至较小的范围, 从而可以简单的判断合法.
## T3(move) [Dp of Dp]
期望:35 实际:35 难度:3.5 用时:**2h**
0.5h-1h 时间段在睡觉.
最优化 Dp 中, 若一个元素的贡献会在转移时多次统计, 考虑将所有转移均分裂成两类, 一类钦定以后不会再让这个元素贡献, 一类不加贡献直接转移. 如本题使经过的区间数量尽可能大, 则可以在最后一次离开当前区间时将数量 +1, 也即要么不加正常转移 要么加且转移到区间右端点 + 1 的位置.
对于一类状态数与值域有关的 Dp, 若其 Dp 值的范围较小且关于值域一维单调, 则交换这两个东西. **不要因为拓扑序与值域有关而放弃去想其他做法, 先考虑能否将这一维的范围缩小.**
## T4(merge) [观察力] [猫树]
期望:65 实际:40 难度:5 用时:1h
本应能够写出 $0 \le a_i \le 1$ 的部分分的, 但由于 T3 思考过久以及睡了一段时间导致时间不够. 正解是毫无意义的 "注意到充要条件".
猫树可以用来当做对于不可重复计算的运算的 ST 表, 因此在静态 $O(1)$ 查询时有用.
## 结算
在 T3 上花费的时间又过于长了. 需要恢复先将所有题目看完且保证 45min 思考时间的习惯.
# 20241020 总结
## T1(sqrt) [线性筛]
期望:100 实际:100 难度:1 用时:0.5h
对于 两数乘积是平方数 的限制, 枚举平方数的值不如枚举其中一个数, 则另一个数需要是某个数的倍数.
## T2(tree) [转换视角] [换根 Dp]
期望:100 实际:100 难度:1.5 用时:1h
对于一类求颜色数的问题, 一般会将其转换为上一个相同颜色位置不在集合内的元素数量.
## T3(info) [观察力] [二分答案] [代表元]
期望:10 实际:10 难度:4 用时:1h
先入为主地认为碰到就必然传递信息, 也算是变相的看错题.
对于一类 固定了时间求最小速度 或 固定速度求最短时间 的问题, 若所有可能的限制都形如 $vt \ge d$, 则可以认为 速度为 1 求最短时间, 并最后转化.
对于一类基于数轴上球左右动和相撞的题目, 考虑其相撞后是否一定会分头走或一定不会分头走, 从而得到最优策略的形态.
即使已经得到了一个较优的做法 (如 $O(n^2)$), 也同样可以考虑二分答案.
对于每个连通块 (集合) 钦定一个唯一满足某个特殊性质的代表元, 则判断两个元素位于同一连通块 (集合) 等价于代表元相同, 则可以将问题转化为对一个元素求解代表元.
## T4(none) [扫描线]
期望:100 实际:50 难度:2 用时:2h
一个较难实现的复杂度更高的做法, 用到了换根 + 复杂的数据结构, 没有调完. 不过值得一提的是给定一棵树, 动态增删边 (增的只能是最初的树已有的边) 并维护树上每个连通块的大小是可以用 树状数组 + 倍增 $O(\log^2 n)$ 维护的.
对于树上问题的限制, 考虑 **固定根** 后将每个限制形式化表示出来. 除非需要对每个结点求出对应答案, 否则很少需要换根. 因此路径计数问题中将一个端点固定为根并换根的方法不常用.
## 结算
最大的败笔在于 T4, 对自己的实现能力了解不够, 在只剩 1.25h 时才开始 在已经写好部分分代码的情况下 写上述做法. T3 变相看错题, 导致浪费了 0.5h 没有进展.
# 20241024 总结
## T1(disinfect) [枚举] [双指针]
期望:100 实际:100 难度:1 用时:1h
写完了之后才发现 $O(c^3 \log c)$ 难以通过, 边想边改浪费了很多时间. 事实上应当先想好一个完善的做法再改.
## T2(card) [二分答案] [贪心]
期望:100 实际:100 难度:2 用时:1.5h
傻逼部分分, 和正解没有一点关系, 浪费我 30min.
当某一部分贡献无论如何决策都会产生时, 考虑事先统计完这部分贡献, 从而简化问题.
## T3(run) [建立虚点] [欧拉路径]
期望:12 实际:4 难度:3.5 用时:1h
对于一张连通图内有 $> 2$ 个奇度点的情况, 将这些点两两增加一条边而非新增一个虚拟点并向这些点连边, 从而使得路径可能有重复的端点. 事实上建立虚点以跑多条欧拉路径的技巧是较为板子的.
改题时 checker 一开始写挂了, 忘记了路径端点不重复的限制, 值得注意.
对于一类带有多个限制的构造题, 若对于每个限制单独做是容易的, 则考虑依次满足每个限制而得到新图. 如每条路径长度为偶数与路径间无重复端点的限制, 将两两的连续边绑定在一起即可得到满足第一个限制的新图.
## T4(path) [扫描线] [莫队] [二次离线]
期望:65 实际:65 难度:5 用时:1h
当莫队移动一个端点的复杂度为一个结点的度数时, 可以根据度数分块, 复杂度 $O(m \sqrt q)$.
对于图论数据结构题中的答案式子, 若将其写为枚举边并求和若干项乘积, 则不好用数据结构维护. 事实上应当考虑将其改写为枚举点并求和若干项乘积, 即使会使得变量数增加. (如 $\sum_{(x,y)} c_x c_y$ 应改为 $\sum_i c_i d_i$, 其中 $d_i = \sum_{(i,j)} c_j$).
莫队的二次离线需要让查询的东西能够前缀和差分得到, 从而将 $O(q \sqrt n)$ 次修改变为 $O(n)$ 次修改. 差分后 $l$ 和 $r$ 中必然有一个是与当前点相同或相差 1 的, 则这部分可以预处理; 而另一个移动的指针与查询的时刻是无关的, 则可以将若干单点查询缩为一个, 从而使空间复杂度降低至 $O(n)$.
写二次离线前应当先写普通的莫队, 从而保证式子正确. 事后再调试是浪费时间的.
## 结算
效率较低, 使得没有时间写 checker 导致挂分. 事实上也是对欧拉路径的掌握不足导致的.
# 20241031 总结
## T1(maze) [计数 Dp] [提前去除非法贡献]
期望:100 实际:100 难度:1.5 用时:1h
尽管有时统计区间内元素的计数 Dp 无需差分, 但差分总是没有坏处的.
对于一类需要保证合法的计数 Dp, 若某个状态非法后无论如何转移都非法, 则可以在最前面的非法位置减去这个状态的贡献, 之后正常转移.
## T2(cablecar) [单调队列]
期望:100 实际:100 难度:1 用时:1h
当数据范围达到 $2 \times 10^6$ 级别时, 尽量将 $\log$ 去掉, 否则容易 TLE. 且此时使用 ST 表对空间的负荷很大, 需要注意空间问题. 险些挂到 40pts.
对于一类形如 相邻两个选择的点距离不能超过 $k$ 的限制, 在 Dp 时记下距离上一个选择的点的距离是愚蠢的, 应当直接从上一个选择的点转移过来.
## T3(apples) [贪心] [可重集 Dp]
期望:100 实际:100 难度:2.5 用时:1.5h
将集合 $S$ 中的数一一放到环上, 使得相邻两数之差的绝对值的最大值最小, 一种最优的方案为将 $S$ 排序后看作一个序列, 正序放奇数位的, 逆序放偶数位的. 证明考虑每个间隙对答案的贡献至少要带上旁边一个间隙.
一个可重集 $S$ 满足 $\sum_{i \in S} i = n$ 的子集个数是较少的, 当 $n = 150$ 时仅有 $4 \times 10^6$ 个. **一个显然的观察是, 可重集内不同的元素至多只有 $O(\sqrt n)$ 种.**
当 Dp 的状态中带了一个可重集时, 一般的状压方式为将其压为一个混合进制数, 则每次枚举状态并展开再转移再压缩, 因为需要对变量取模而常数较大. 可以直接搜索这个可重集并维护每个元素的出现次数, 转移时直接加上对应的变化量即可.
## T4(run) [点分治] [去除非法贡献]
期望:44 实际:44 难度:3 用时:1h
感觉大多数基础点分治题, 难点都在于想到点分治, 后面都是板.
改题时递归到子树继续分治的部分将 ``s = v[i].s > v[x].s ? _s - v[x].s : v[i].s;`` 写为了 ``s = min(_s - v[x].s, v[i].s);``.
点分治并不局限于求解链相关的问题, 对于连通块相关的问题本质上可以认为一个点在连通块内当且仅当父链上的点都合法.
点分治求解计数类问题时, 由于统计的链的开头和结尾不能在同一颗子树, 可以多跑若干次相同的算法将这部分贡献减去.
## 结算
没有策略, 所以没有大的失误 (?). 每道题都做的很顺.
写代码的正确率低了, 调了很多地方, 尤其是 T4 的链的部分分下考前 3min 才调完, 导致少写一个预计实现时间 30min 的部分分.
# 20241103 总结
## T1(testdata) [构造] [贪心]
期望:100 实际:100 难度:1.5 用时:0.5h
略.
## T2(mechanic) [最优化 Dp]
期望:100 实际:100 难度:2.5 用时:**2h**
吾有三罪. 下设修的机子中只修到了 $a_i$ 的集合为 $S$, 修到了 $b_i$ 的集合为 $T$.
- 其一为认为 $T$ 为 $S \cup T$ 按 $b_i$ 升序排序的一个前缀.
- 其二为发现 $S$ 为 $U \setminus T$ 按 $a_i$ 升序排序的一个前缀后一直从 $a_i$ 排序思考, 而没有注意到 $T$ 为 $U \setminus S$ 按 $b_i$ 升序排序的一个前缀.
- 其三为在犯了第一个错误以及写挂 $O(n^4)$ 暴力时对已经证明的结论 (如机器人和主人不会分开, 先修 $T$ 再修 $S$ 等) 大加怀疑, 浪费了大量时间.
对于一类序列 Dp, 若其可以划分为前后两半使得满足不同的优美的性质, 则可以对前缀和后缀分别 Dp 再合并.
## T3(girl) [计数 Dp] [并查集]
期望:100 实际:100 难度:2.5 用时:**2h**
数组越界调了 45min. **写代码时把可能出现的边界标记是个好习惯.**
离线求包含某点的所有区间中 $l$ 的最大值, 可以转化为区间覆盖问题, 使用并查集解决. 再不济可以将查询离线并排序, 使用线段树解决. 不要用愚蠢的主席树.
## T4(leading) [观察力] [分治] [双指针]
期望:30 实际:0 难度:3.5 用时:<0.5h
$O(n^3)$ 的暴力中, 将 对于连续段的双指针方式 错误的写为了 对于左右端点有偏序限制的双指针方式, 考试的最后调了 5min 并没有发现.
对于一类选取一个区间, 贡献与区间最值相关的最优化问题, 考虑枚举右端点并单调栈维护不同左端点的最值. 之后的最优化贡献考虑使用线段树维护.
对于一维偏序问题, 若序列有单调性, 则可以双指针做到线性. 那么对于二维偏序问题, 若两个维度的序列分别有单调性 (不一定需要方向相同), 则同样可以双指针做到线性.
对于一类序列上有若干连续段, 一点贡献只与所在连续段有关的问题, 考虑选取的连续段是否会始终经过某个定点 (或利用分治来钦定), 则可以将连续段问题转化为前后缀问题.
实现上, 若算法上需要做多次相似度高的事情, 比起直接循环并用 ``if`` 或三目表达式处理不同的位置, 第一次写时更应当重复写多遍以先获得一个模板. 但复制粘贴时应当注意所有的不同点都修改完成, 调试中修改代码应当注意在 **每一处** 都 **位置准确** 的修改.
## 结算
T4 是原, 且考场上应当能够想到一个 $O(n \log^2 n)$ 的做法. 但由于 在 T2 与 T3 上浪费过多时间 以及 没有第一时间读 T4 的题意 导致没有拿到任何分数. 事实上应当尽早将 T2 弃掉来开后面的题, 能够在只少 20pts 的情况下获得大约 1h 的实现 T4 的时间, 足以实现 $O(n^2)$ 做法以获得 55pts.
# 20241107 总结
## T1(cloud) [差分] [集合 Dp]
期望:100 实际:100 难度:1 用时:0.5h
对于一类区间加 $x$ 的操作, 考虑将原序列和目标序列均进行差分.
对于一类集合 Dp, 若转移是枚举一个不在 $S$ 里的元素并加入, 则比起直接枚举 $[1, n]$, 考虑 ``s ^ (1 << n) - 1`` 不断删去 ``lowbit`` 可以获得更小的常数.
## T2([sing](https://www.luogu.com.cn/problem/CF1887F)) [构造] [贪心]
期望:100 实际:100 难度:3 用时:1.5h
对于一类需要一些区间出现的数等于全集的限制, 考虑从左往右依次构造并时刻满足右侧全集的数恰好都出现过一次, 然后贪心地将当前数放在最靠左的合法后继.
感觉缺乏泛用性, 甚至这个做法都是手玩后直接想到的.
## T3([basketball](https://www.luogu.com.cn/problem/P10041)) [区间 Dp] [钦定状态]
期望:over 68 实际:12 难度:4 用时:**2h**
若区间 Dp 的转移中子区间需要满足某些限制 (如转移途中不能和 $l-1$ 或 $r+1$ 发生合并), 则考虑直接给状态钦定上这个条件并修改转移.
对于一类最优化区间 Dp, 若转移的形式为选择一个特殊的子序列, 贡献为子序列剖出的若干区间的 $f_{l, r}$ 值之和, 则事实上只需要考虑子序列包含了 $l$ 和 $r$ 的情况, 其余情况可以由两个区间拼起来转移. 且此时无需在内部 Dp 子序列 (这样做是 $O(n^4)$ 的), 可以额外设状态 $g_{l, r}$ 表示已经选了一个包含 $l$ 与 $r$ 子序列, $f$ 与 $g$ 互相转移是容易的, 则做到了 $O(n^3)$.
## T4(calm) [树形 Dp] [二分答案] [邻域] [线段树合并]
期望:24 实际:8 难度:4 用时:0.5h
看错题了, B 走的最后一条路径同样要求未走过, 导致链的部分分式子推错.
经典套路, 但改题的时候还是没想出来. 对于一类转移只含 max 与 min 的 Dp, 若最终只关心一个位置的值, 则可以二分这个位置的值, 从而将值域变为只有 0 1 或只有 -1 0 1. 如 20241010 T4 median.
对于一类与邻域有关的最优化树形 Dp, 若转移为差分约束的形式, 考虑以值域为拓扑序 (特别地, 当可能的取值只有两种时可以依旧使用树形拓扑序, 并只用更优的值尝试更新), 每次将邻域内的点赋值并删去, 则可以在 lca 处将一个点的值转移到另一个点上. 以深度为关键字, 用可并小根堆解决; 也可以直接按 dfn 建线段树, 每次查找子树内深度最浅的没被删的点. 显然后者更优.
可并堆可以用线段树合并实现, 时间复杂度一致但常数稍大, 空间复杂度多 $\log$, 但泛用性更高. ~~而且我不会可并堆.~~
## 结算
考场上想到了 T3 的 $O(n^4k^2)$ 做法, 但自信实现了一个经过错误优化的 $O(n^3k^2)$ 做法后发现假了, 便理所当然的认为 $O(n^4k^2)$ 做法也是假的, 便神秘的在最后的 30min 不写 $O(n^4k^2)$ 做法而是试图给 $O(n^3k^2)$ 做法加补丁. 脑子坏掉了.
# 20241114 总结
## T1(dice) [二分]
期望:100 实际:0 难度:1 用时:1h
做法不难想到, 故略. 下面是从 100 挂到 0 的精彩集锦.
首先, 将集合里至多有两种数默认为恰好有两种数, 一个循环的下界设为了 1 而非 0; 但没有过第三个样例, 因为第三个样例的集合中只有一种数, 于是特判了集合里全是 2 的情况.
其次, 在统计答案时没有注意到 $l$ 的上界可以取到 $10^{18}$, 乘上一个 $10^9$ 的 $a$ 便炸了 ``long long``, 故尽管最终的答案是 ``long long`` 级别, 途中求值时也应当使用 ``__int128_t``.
最后, 判断 $v^i(v+1)^j \le n$ 时, 由于发现了左式有可能爆 ``long long`` (为毛就没发现统计答案会爆), 故将其改写为 $i \log v + j \log (v+1) \le \log n$, 并使用 ``long double`` 判断. 显而易见的是, 一个爆 ``long long`` 的数字不可能换成 ``long double`` 就不爆精度了, 应当使用 ``__int128_t`` 存储快速幂的结果, 并在结果超过 $n$ 时及时返回.
事实上, ``double`` 的有效数字为 15 位, ``long double`` 的有效数字为 18 位, 均远大于精度误差, 且当最后一个有效数字位于个位时, 均不超过 ``long long`` 的范围. 翻倍的空间主要用在了值域的上界从 10 的几十次方变成了几千次方. 由于二者运行时间的差距极大, 故 ``long double`` 完全没有用.
## T2(star) [mex 相关] [线段树二分]
期望:100 实际:100 难度:2 用时:1h
$\text{mex}$ 为补集中的最小值, 故一些集合的 $\text{mex}$ 的最小值等价于最小的在其中一个集合内没有出现的数字. 故若这些集合是所有长度为 $l$ 的区间, 则可以对每个值求出最大 gap 并判断与 $l$ 的关系.
当可以动态维护每个值的存在性时, 显然可以用线段树二分求当前集合的 $\text{mex}$.
## T3(yilihun) [观察力] [计数 Dp] [半在线位与卷积]
期望:12 实际:12 难度:4 用时:1.5h
当不一定合法的元素数量一定且好求时, 计数合法的元素数量可以转化为计数所有元素中合法的概率. 具体应用如 [一类特殊排列计数问题的另类解法](https://www.luogu.com.cn/article/ft3tx54e).
对于半在线位与卷积 (即 $f_s \times g_t \rightarrow f_{s \cap t}, s \not \subseteq t$), 可以以 $\text{popcount}$ 为拓扑序, 从大往小地递推, 每次将 $\text{popcount} > i$ 的转移到 $\text{popcount} = i$ 的. 故需要做 $O(n)$ 次 $O(n2^n)$ 的 FWT, $O(n^22^n)$.
## T4(symphony) [双调排序]
期望:? 实际:71 难度:5 用时:1h
写了一个正确性错误的做法, 本地弱的 spj 拿了 90+pts.
一种新的 $O(n^2)$ 排序算法: 从大往小枚举区间长度, 再枚举区间 $[l, r]$, 判断 $a_l$ 与 $a_r$ 的大小关系, 并决定是否交换.
[双调排序](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## 结算
时间分配稍微不合理, 在最后的 30min 应当回去检查四道题代码, 尤其是使用了浮点数的 T1, 而不是思考 T3 试图多拿一些分.
对于没有大样例的题目 (如本场 T1), 手搓一些容易求出答案的大样例并跑. 不应当过于简单, 如本题两种操作的代价不应当都为 0.
# 20241117 总结
## T1(cover) [枚举] [二分]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(robot) [贪心] [递推]
期望:100 实际:100 难度:2 用时:1.5h
对于一类局面和决策均较少的 Dp, 考虑其是否有固定的最优决策, 从而转化为递推.
当找到了比较优良的性质之后就不要考虑找规律了, 应当直接设状态开始做. 或者在一开始就设一个庞大的状态, 找到性质后考虑优化.
## T3(draw) [搜索] [容斥] [插板法]
期望:50 实际:50 难度:2 用时:1.5h
对于一类元素极少 (本题只有 4) 的计数问题, 考虑爆搜缩略图并对一张缩略图计数. 去重考虑暴力枚举集合容斥, 非空的 **应当** 很少 (本题 $2^32$ 的状态中非空的只有几百个), 这便考验胆量了.
对于一类给定每个区间长度的取值范围, 在长度固定的区间内有序地截取这些不交的段, 考虑容斥变成只有下界, 在左端点与右端点加一处放一个标记, 则标记不重合, 直接组合数即为 $n + 1 - \sum_{i=1}^m (l_i-1) \choose 2m$.
在想用高斯消元插值前, 先考虑答案是否真的完全是一个多项式的形式, 而不带有任何分类讨论.
## T4(triangle) [扫描线] [拆分图形]
期望:30 实际:30 难度:4.5 用时:1h
对于一类互相平行的等腰直角三角形面积并问题, 设三角形 ABC 中 C 为直角, 考虑沿 向量 CB 方向扫描 AC 方向, 每次加入 AC 与当前扫描线重合的三角形, 维护只考虑和当前扫描线有交的三角形的扫描线前方 (在 CB 向量上的前方) 部分的面积并形状, 用若干三角形和梯形表示且需互相无交, 如果自己没被包含则把包含的三角形删掉, 把前面一个三角形削掉一个角, 使得这些图形依旧无交.
对于一类多次求若干图形的面积并的问题, 若初始状态到每次查询的修改量较少, 则直接将初始状态拆分为若干不交的图形 (如三角形的并拆分成若干梯形), 查询时依次取交容斥即可.
## 结算
过于缺乏自信, 导致 T3 的去重想了一个极其复杂的 Dp, 故在只剩最后 1h 的情况下没写, 转而分类讨论 $k=3$ 的情况, 最终也失败了. 事实上, $O(n^kk\log n)$ 的暴力枚举在使用记忆化 Dp 后居然能惊人的通过 $n=100$, $k=4$.
快下考且暴力分都拿完时, 或许应当提高胆量.
# 20241121 总结
## T1(scc) [交换求和顺序]
期望:100 实际:100 难度:1 用时:0.5h
略.
## T2(o) [观察力] [范德蒙德卷积]
期望:100 实际:100 难度:2 用时:1h
学到了一种没用的倍增方法: 从小到大枚举步长, 非法了就退出, 再从刚刚的值开始从大到小枚举步长. 设查找到的位置是 $p$, 这样枚举的次数是 $2 \lfloor \log_2 p \rfloor + 2$, 与数组的长度无关.
值小于等于 $m$ 的数量至少为 $t$ 的限制等同于第 $t$ 小的值小于等于 $m$.
则对于一类形如 $\sum_{i > t} {m \choose i} {n-m \choose k-i}$ 的式子, 考虑其组合意义, 在前 $m$ 个中至少选 $t+1$ 个, 则枚举第 $t+1$ 个的位置, 有 $\sum_{i \le m} {i-1 \choose t} {n-i \choose k-t-1}$, 成功地将 $t$ 从枚举范围换到了组合数中, 将 $m$ 从组合数中换到了枚举范围. 注意 $t<0$ 时等式不成立, 需要改用真正的范德蒙德卷积.
## T3(leaf) [换根 Dp] [扫描线]
期望:100 实际:100 难度:2 用时:1.5h
对于一类树上多次查询某条链的问题, 若一次 Dfs 可以快速地求出以一个点作为端点的所有答案, 则考虑离线查询并换根 Dp.
对于一类查询链上有多少个元素的值恰为 $x$ 的问题, 考虑离线下来按 $x$ 排序, 每次加入恰为 $x$ 的元素并使用树状数组与链上差分维护和.
对于一类查询与 链上所有点, 排除了 不经过这个点的连通块中链的某个端点所在的那个 之后的点集 有关的问题, 考虑预处理每个点子树内和子树外的答案, 分类讨论 Lca 两侧的点即可.
树上查询问题把图画出来会好考虑很多, 且一般需要固定根.
## T4(stone) [观察力] [计数 Dp]
期望:40 实际:50 难度:3 用时:1.5h
数据水了, $n \le 8$ 的部分分尽管不满足特殊性质, 但使用特殊性质的做法同样可以通过.
对于猜测的合法条件, 若实践证明了其是正确的, 则考虑构造一组合法的方案. 当需要将合法条件扩展到适用更多的情况时, 考虑在什么更细化的情况下构造的合法方案会不合法.
如本题特殊性质 A 的合法操作方案之一为, 先将段内的不需要的字符删去, 则需要的字符全部合并, 再将两段之间的字符删去. 当没有特殊性质时两段之间的字符可能为空, 可能发生不想要的合并.
## 结算
并没有大的失误. 在推 T2 那个类范德蒙德卷积的式子时为了图方便进行了换元, 丢失了 $m+(n-m)=n$ 的条件. 以后在换元时应当先考虑哪些值是常量.
# 20241124 总结
## T1(sort) [逐位考虑] [贪心]
期望:100 实际:100 难度:1 用时:0.5h
``builtin_clz`` (count leading zero) 可以计算一个 ``unsigned`` 变量的前导零个数, 则可以使用它来计算 highbit.
## T2(swap) [复合排列] [快速幂]
期望:100 实际:100 难度:2 用时:0.5h
排列的快速幂是可以做到线性的. 具体地, 将每个置换环求出来, 直接取模即可.
## T3(calc) [实数期望] [二项式定理]
期望:100 实际:100 难度:3 用时:**2h**
当期望中出现非线性函数时 ($\max$ 和 $\min$ 可以简单地用 min/max 容斥解决), 若在期望的式子中仅出现了一个非线性函数, 且其外部仅有 $k$ 次方, 则可以考虑使用二项式定理. 如 $E(\lfloor x \rfloor ^k)$ 可以用 $E(x^p)$ 和 $E((x \bmod 1)^p)$ 来表示.
有一个在区间 $[l, r)$ 均匀随机的实数变量 $x$ 和一个函数 $F:\R \rightarrow \R$, 则 $E(F(x)) = \frac{1}{r-l} \int_{l}^{r} F(x) \, \text{d}x$.
期望具有可乘性. 具体地, $E(xy) = \sum_w w \sum_{xy=w} P(x) Q(y) = (\sum_x x P(x))(\sum_y yQ(y)) = E(x)E(y)$.
期望满足二项式定理. 具体地, $E((x+y)^k) = \sum_{i=0}^k {k \choose i} E(x^i) E(y^{k-i})$.
等概率地取模卷积的结果也是等概率的. 具体地, $n$ 个 $[0, 1)$ 范围内均匀随机的变量的加和的小数部分是在 $[0, 1)$ 范围内均匀随机的.
## T4(mo) [转化贡献] [转化操作] [观察力] [ODT]
期望:25 实际:25 难度:4 用时:1.5h
对于一类求区间内颜色数的问题, 若同一种颜色只会形成至多一个连续段, 则可以维护相邻两个元素是否相等, 并转化操作的意义. 如对于一个 $a_i = i$ 的序列, 每次将 $[l, r]$ 都赋为 $a_l$, 则可以维护 $b_i = [a_i \neq a_{i+1}]$, 一次操作相当于 $b_r \leftarrow \text{Or}_{i=l}^r b_i, \forall l \le i < r, b_i \leftarrow 0$.
对于一类维护 $n$ 个 01 变量并进行 $m$ 次操作的问题, 常用的套路是考虑每个 01 变量是否只会从 $0$ 变成 $1$ 或反之.
## 结算
最刺激的一场. 花费了 1.5h 通过 T1 T2 后, 在 T3 上卡了 1h 想到了一个维护分段函数并支持卷积+积分的 $O(n^3)$ 做法, 明智地没有写这个做法转而去思考 T4. 在思考了 0.5h 后想到了一个假做法并花了 0.5h 实现出来, 发现 **连最小的样例都过不去**, 遂开始想部分分, 想了一会之后不甘心地回去继续想 T3. 在最后的 1h 内得出了正解, 手玩样例并经历了一系列计算错误后证实了正确性, 顺利切掉并写完了 T4 的暴力.
被一道题卡住时想别的题换脑子是极其有效的.
在得到了一个做法后一定要使用这个做法来计算样例, 以一定程度保证做法的正确性.
# 20241129 总结
## T1(mst) [观察力]
期望:100 实际:100 难度:1 用时:0.5h
对于一类求最小生成树的题目, 若原图中权值最小的边很多, 则考虑直接用这些权值最小的边来造树.
## T2(mex) [观察力] [Dp of Dp]
期望:100 实际:60 难度:2 用时:0.5h
在证明 $f_{i, S} = 0/1$ 关于 $i$ 的单调性时用到了扔掉一个区间内的数的决策, 但在转移时并没有考虑这个决策.
$\text{mex}(S) = i \rightarrow |S| \ge i$, 则对于函数的嵌套, 若内层是 $\text{mex}$, 可以考虑整个函数是否只有根号种值.
## T3(cactus) [二维 Dp 取最优项] [线段树]
期望:40 实际:25 难度:3 用时:1.5h
被卡常了, 本地不开 O2 2s, 开 O2 1s, mx 上 >3s.
对于一类最优化 Dp, 若状态中至少有二维, 且某一维仅用来满足 ban 掉上上个元素的某个取值的条件, 则考虑在这一维中只取最优的两个, 找到这两个与转移使用线段树实现, 需要转移可以通过以编号为下标的线段树完成.
同时, 对于这类需要维护三元组 (倒数第二项, 最后一项, Dp 值) 的题目, 维护前两大时一定要考虑清楚是要保证这两大哪一位不同.
## T4(sort) [分类讨论] [逆序对]
期望:0 实际:12 难度:4 用时:**2h**
做法假了, 难度主要集中在实现.
将一个排列 $p$ 变为 $q_i = i$ 需要的最小邻项交换次数为逆序对个数, 而非 $\frac{1}{2} \sum_i |i-p_i|$. 后者偏小了.
对于一类需要极多分类讨论的题目, 切忌一开始想到一个小技巧可以消去一半的分类讨论, 便不加验证理所当然地认为这是正确的. 应当在纸上踏实地讨论完全部情况, 再考虑能否通过某种技巧合并不同情况. 如本题中通过在最后加入一个 ``+i``, 只讨论整个序列长度为偶数的情况, 则序列长度为奇数时会算到不合法的情况, 同时也会漏算情况.
## 结算
开局 45min 切完前两题, 感觉稳了.
对于最小邻项交换次数这样的经典结论应当背熟, 否则会像本场在这里假 1h.
对于分类讨论的题目, 应当一个 Sub 一个 Sub 的写, 这样收益至少是比较确定的, 不会有写假然后全挂没的情况. 事实上若 T4 使用了这个策略, 应当可以至少获得 40pts.
NOIP rp++.
# 20241210 总结
## T1(a) [幂转组合数] [容斥]
期望:8 实际:8 难度:3.5 用时:**2h**
有 $a^k = \sum_{i=0}^k {a \choose i} {k \brace i} i!$, 其中 ${k \brace i}$ 为第二类斯特林数. 由此可以在一类一个方案的贡献为某个函数的 $k$ 次方的形式的题目中, 将 $k$ 个可重有序指针换成 $i$ 个不可重无序指针.
进一步地, 有 $\sum_{S \subseteq U} P(S) {a=|S| \choose i} = \sum_{S \subseteq U} P(S) \sum_{T \subseteq S, |T| = i} 1 = \sum_{T \subseteq U, |T| = i} \sum_{S \supseteq T} P(S)$, 即对于指针的每个指向方案计算包含这些元素的方案数并求和, 也即钦定 $i$ 个位置需要存在的方案数和. 当每个位置地位相同时可以只计算 $[1, i]$ 并乘上 ${|U| \choose i}$.
对于一个下标为集合的组合空间, 若有 popcount 相同时方案数相同, 则已知所有含有 $i$ 个 0 的集合的方案数之和 $(i \le t)$, 则可以通过容斥求出所有含有 $i$ 个 0 $j$ 个 1 的集合的方案数之和 $(i + j \le t)$.
## T2(b) [整体二分] [贪心]
期望:70 实际:70 难度:3 用时:1.5h
对于一类 $a_{p_i} + a_{p_{i+1}} \le \text{Const}$ 的限制, 考虑将所有元素减去 $\frac{\text{Const}}{2}$, 按 元素对 各自的正负性分类讨论以贪心.
使用整体二分时, 若序列随 mid 的变化而变化的方式比较复杂 (比如要动态维护未来可能加入的贡献集合), 考虑一开始按 mid 扫描线求出所有的变化, 二分时只需修改而不需维护; 不过每次暴力找到加入/删除的贡献集合并修改复杂度也是对的.
## T3(c) [观察力] [树上直径] [点分治]
期望:15 实际:15 难度:5 用时:1h
若干点的 $d$ 邻域的交为直径两端点的 $d$ 邻域的交, 为圆心 (直径中点) 的邻域.
两条有交的链的邻域的交为链交的邻域.
## 结算
尽管见到过很多次, 但依旧没有想到将幂转化为组合数的技巧, 且不认为能想到第二步的 choose $i$ 转化为 包含 $i$. 计数方面的技巧见的太少了.
T2 一个与正解毫无关系的正确做法拿到了较高分数. 不过即使及时地回退思路并想出了正解也难以实现. 对整体二分的熟练度不够.
# 20241212 总结
## T1(a) [计数 Dp] [滚动数组优化]
期望:100 实际:100 难度:2 用时:1.5h
对于一类式中除了拓扑序以外的下标都不变的转移, 考虑使用滚动数组, 则可以处理这类转移.
## T2(b) [观察力] [最优化 Dp]
期望:55 实际:25 难度:3.5 用时:1.5h
被卡常了. 虽然复杂度为 $O(n^2\log n)$, 但本地 10 组 3000 的数据不开 O2 1800ms, 开 O2 800ms, 交上去 >2s.
对于一类最优化 $n$ 个变量的取值使得某个贡献式子最大的题目, 考虑每个变量的可能取值, 一般为 $O(n)$. 事实上很多题目中变量的可能取值都是通过一个卡满的连续段来求得, 但直接根据卡满的连续段 Dp 难写且常数劣于按取值 Dp.
## T3(c) [点分治] [分类讨论] [李超线段树]
期望:20 实际:0 难度:4.5 用时:0.5h
只有最后 10min 写暴力, 且 $O(n^3)$ 的暴力还写挂了.
同 20240221 c.
## 结算
T2 卡常花费了过多时间, 而没有注意到使得复杂度带有 $\log$ 的排序事实上可以递推并使用插入排序实现, 从而做到 $O(n^2)$. 由此将最后的 40min 浪费到了只剩 10min, 从而没有写 T3 的暴力.
不过事实上冲 T2 的策略是正确的, 至少拿的分更多. 但当自己的代码差一点就能通过时, 若复杂度明显高于数据范围想要的复杂度 (指多一个 $\log$ 之类), 比起卡常更应当尝试优化算法的复杂度.
# 20241217 总结
## T1(a) [模拟]
期望:0 实际:0 难度:4 用时:**4h**
少考虑了一种情况, 且应当会被卡常. 思维难度极其低的题目, 但直到下考后 3h 都没有调出来, 遂放弃.
对于一类看一眼就知道难度集中在实现的题, 在写代码之前先 **暴力** 地枚举每种可能出现的情况, 而不应当认为自己发现了一个良好的性质便理所当然的认可其的正确性.
对于一类有大量分类讨论的题目, 无论自己的算法能否兼容其中的某些 特殊/边界 情况, 都应当将其 **记录** 下来以便以后调试.
## T2(b) [观察力] [计数 Dp]
期望:100 实际:0 难度:2.5 用时:0.5h
快速的想出来了做法, 但并没有实现.
对于一类涉及元素极少 (两个) 的操作, 若每次会对序列中每对相邻元素都同时进行操作, 则通过手画一个稍大的序列, 观察序列的变化满足的性质. 注意应当考虑到每种情况.
与 之前正睿考过的一道题 (每次询问一个区间最后剩下的是什么字符) 的观察力部分相同.
## T3(c) [构造] [高斯消元]
期望:0 实际:0 难度:4 用时:0h
构造题的常见套路是, 考虑一个局面合法的必要条件, 并试图通过构造来说明其也为充分条件. 则途中可以对序列提前进行一些操作, 以将一些局面规约到同一个特殊的局面, 便于处理.
对于一类操作为对 $n$ 个元素做线性变换, 需要构造长度为 $n$ 的操作序列, 每次操作的参数恰为一个且可以自由设置, 但最终每个元素都要恰为一个给定值的构造题, 考虑高斯消元并构造一个特殊的操作序列, 使得解这个由操作序列推出的方程组是简单的, 并只要满足某些合法的必要条件则方程组有解.
## 结算
不妨庆祝今天的 **小金鱼记忆力**, **唐氏考试策略** 和 **久违的爆零**.
很快的把 T1 与 T2 都口胡了, 但 T1 口胡的做法少考虑了一些情况 (头藏在身体中间, 对四个最值没有影响, 则最小值不取在折线的两端点; 头和尾相向而行, 最小值取在中点), 因此自认为 T1 的实现难度不高而索性顺序写题. 在 2.5h 后发现了少考虑的第一种情况, 并快速的修复了自己的算法, 然后一直写 & 调第二种情况到最后.
值得一提的是, 在最初开始实现 T1 时我便意识到了第二个特殊情况, 但我自信的认为自己的算法能够兼容这种情况, 在最后却忘记了这种特殊情况而没有检查程序在这种情况下的的正确性.
事实上理应先把 T2 写完 (T1 的未知实现时间和 T2 的 <1h 实现时间显然是容易比较的), 略微地思考 T3 并写暴力再实现 T1.
# 20241219 总结
## T1(a) [观察力] [哈夫曼树] [线段树]
期望:80 实际:0 难度:3 用时:**4h**
与正解同复杂度, 但被卡常了, 80pts->50pts.
调用 ``multiset`` 与 ``unordered_multiset`` 的 ``erase()`` 函数时, 若传入的是一个值而非迭代器, 则会将容器内 **所有** 等于这个值的删去. 若只想删去一个, 应当使用 ``find()`` 找到迭代器再删去.
线段树中, 相比于使用标记下传, 使用标记永久化技巧可以降低常数.
一棵哈夫曼树合法的充要条件为 (设非叶子结点的点权 $w_i$ 为子树内所有叶子结点的点权和): 1. $\min_{dep_x = i} \{w_x\} \ge \max_{dep_x = i+1} \{w_x\}$. 2.存在一种给每个非叶子结点赋 $\le$ 或 $\ge$ 符号的方式, 使得每个非叶子结点的两个儿子 $x$ 与 $y$ 的深度为 $d$ 的子孙集合 $S_{x, d}$ 与 $S_{y, d}$ 满足 $w_u \oplus w_v (u \in S_{x, d}, v \in S_{y, d})$, 其中 $\oplus$ 为 $x$ 与 $y$ 父亲上赋的符号. (直观理解为值域在垂直方向和水平方向都无严格交).
## T2(b) [期望 Dp] [倍增]
期望:40 实际:40 难度:3.5 用时:0.5h
树上随机游走中 Dp 期望步数的方式为, 设 $f_i$ 表示 $i$ 走到父亲的期望步数, 有 $f_i = deg_i + \sum_{j \in Son_i} f_j$, 而不需要设 $g_i = a_i g_{fa} + b_i$, 其中 $g$ 为走到根的期望步数, 事实上有 $a_i = 1$, $b_i = f_i$.
对一类静态查询树上路径相关属性的问题, 应当优先考虑将问题划分为若干个互相独立的问题, 预处理一些值后倍增或差分. 之后再考虑实现上更为复杂的数据结构维护换根.
## T3(c) [观察力] [费用流]
期望:35 实际:0 难度:5 用时:0h
应当写一个暴力费用流的, 但没时间了.
能肉眼观察出这个性质的诗人握持: 对于如下图所示的小三角形组成的平行六边形, 若在对偶图中完美匹配所有的小三角形, 并删去被匹配的两三角形中间的边 (即用小平行四边形覆盖平行六边形), 一组完美匹配与空间中一种堆叠立方体使得高度在两个方向上都单调的方式一一对应.


由此可以在最优化问题中将 $O(n^2)$ 流量的费用流降低至 $O(n)$ 流量的费用流, 或在计数问题中使用 LGV 引理.
## 结算
在 T1 卡常上浪费了 1h, 但并没有提高分数. 以后不应在考场上卡常, 而是优化算法或思考其他的题目或写其他题目的暴力.
# 20241224 总结
## T1(a) [二进制分组] [元素重编号]
期望:100 实际:100 难度:2.5 用时:1h
判断两个二进制编号是否相等时, 需要分类讨论左 0 右 1 和左 1 右 0 的情况, 则会带有两倍常数. 事实上选取一个稍大于 $\lceil \log_2 n \rceil$ 的数, 并只使用 popcount 相等的那些数来重编号, 即可保证一定存在一对左 0 右 1.
交互题中若需要引用特殊头文件, 不应使用尖括号而应当使用引号.
与这道 [题](https://www.luogu.com.cn/problem/P11344) 用了相似的思路.
## T2(b) [观察力] [BDFS 序] [树链剖分] [线段树二分]
期望:40 实际:10 难度:3.5 用时:**1.5h+1.5h**
下考后 1min 写完代码 (11k) 且过了 40pts, 难绷. 神奇的是我 1.5h 赶出来的巨长代码居然没挂.
数据结构题中求解原问题时, 若原问题为最优化问题, 一个重要思路为考虑原问题的答案最劣可能是多少, 若取值范围极小则直接分类讨论. 注意不遗漏特殊情况, 以答案为拓扑序从优到劣考虑.
使用树链剖分+线段树判断一条链是否是前缀 $<x$ 后缀 $>x$ ($x$ 为给定整数) 的方式为, 查出每个重链的 $\max$ 与 $\min$, 找到分界点唯一可能在的位置 (多个和没有的情况是简单的) 并在对应线段树上二分.
同 20240514 T1. 事实上对于一类与链, 子树, 较小的邻域有关的操作, 另一种维护方式 (还没有实现过) 为, 对每个结点 $x$ 维护 $t_i$ 表示 $x$ 的非重儿子的所有子树内的第 $i$ 层结点的值都需要加上 $t_i$, 各种操作都是可以做的. 但是似乎会复杂很多.
## T3(c) [01 trie] [计数 Dp]
期望:5 实际:5 难度:4 用时:0.5h
对于一类填表格使每一行组成的字符串递增的限制, 考虑使用 Trie 树, 则按先列再行的顺序进行决策时只需考虑一个结点应当连哪些出边. 尤其在字符集大小为 2 时.
对于一类对 每个阶段的发生变化的编号最小的元素 的限制, 无需将阶段中每个元素的以前状态记录下来, 而可以在状态中钦定当前阶段无需考虑这一限制, 分类讨论编号最小的元素如何合法地转移, 并枚举第一次发生变化的阶段即可.
优化状态时应当考虑哪些量是最终统计答案所必需的, 其余的尽可能的合并.
## 结算
在研究 ``#include`` 上花费了 20min, 求解 T2 的原问题花费了 1h. 减少这两部分用时应当能够在下考前写完 T2.
# 20241226 总结
## T1([a](https://qoj.ac/problem/6553)) [元素分组] [括号匹配] [贪心]
期望:100 实际:100 难度:3 用时:2h
当限制条件和贡献中不同颜色的元素都 **相对** 独立时, 可以考虑将每种颜色的元素分开考虑 (此时无法考虑的限制条件和贡献可以先忽略), 以简化局面而便于发现更多的性质.
对于一类贡献形式为在操作序列的靠前位置加入并在靠后位置删除的问题, 分别决策加入和删除是困难的 (或许删除时不用决策, 但加入时不清楚何时删除一定是困难的), 应当先考虑加入与删除操作是否可以通过类似括号匹配的方法变成固定的若干组匹配, 然后整体决策一个加入-删除对 (也即区间).
对于一类最优化问题, 若操作包含了依次加入每个元素, 超过容量限制时选择一个元素丢弃, 且丢弃的元素不造成贡献, 则可以转化为决策每个元素是否加入, 任何时刻不可超过容量限制.
## T2(b) [绝对值转最大值] [贪心] [最小直径生成树]
期望:25 实际:25 难度:3 用时:2h
对于一类最优化问题, 当数据随机时, 给爆搜加上最优性剪枝后可以大幅降低常数, 即使在搜索途中暴力地判断成为瓶颈. 常数视题目而定, 本题约为 $10^{-5}$. **注意** 由于每次搜到叶子都会更新最优答案, 在搜索的途中也应当 **全局地** 判断是否依旧满足最优性.
一种拆绝对值的方式为 $|a| = \max(a,-a)$, 在最优化问题中常用. 还有一种是分类讨论正负性.
对于一类每个元素有恰好两维附带属性和若干种取值, 通过决策每个元素的取值来最小化与两维分别的最大值正相关的函数的问题, 不应当使用二分答案, 而应当先删去被偏序的取值, 将每个元素的取值按第一维降序排序后进行 $n$ 指针, 每次取指向第一维最大的元素的指针并将其后移. 初三就会且场切了这个套路 (但是多了一个冗余的二分), 现在反而不会了, 绷.
当最优化问题中出现了一个很 **难以不满足** 的限制但使得答案的式子变得丑陋许多 (如从只有最大值变为有最大值和次大值和分类讨论) 时, 考虑先按照不考虑这个限制的优美式子贪心, 若途中更新答案时不满足这个限制则重新使用另一种方式贪心 (此时的贪心只需考虑不满足限制条件的情况, 应当能得到更简单的做法). 需要保证贪心过程中不满足限制的情况的出现次数是较少的, 且应当证明正确性或确信自己走投无路了.
[最小直径生成树 OI-Wiki 页面](https://oi-wiki.org/graph/mdst/).
## T3([c](https://qoj.ac/problem/1257)) [观察力] [栈转树] [不会]
期望:5 实际:5 难度:5 用时:0.5h
$n$ 个结点的儿子有序的小根堆 (可多叉可一叉) 的数量, 也即对每个 $n$ 个结点的无标号有根树的拓扑序求和的结果, 为 $(2n-3)!! = \prod_{i=1}^{n-1} (2i-1)$. 证明考虑第一种理解, dfs 堆的过程中自上往下通过一条边时往序列末尾加入这条边连接的深度较大的点的编号, 自下往上回溯时同样加入这个点的编号, 则往 $n-1$ 个点的树加入 $n$ 号结点时, 其必然为一个叶子, 则序列中两个 $n$ 是连续的, 且可以插入进任意位置 (对应到前一个数的儿子或兄弟), 则方案数为 $(2n-3)$.
往栈中加入元素并最终全部弹出的操作, 可以与 dfs 一棵有根树对应.
不会.
## 结算
发现不会求解上文中的小根堆数量, 果断放弃 T3. 想了 1h T1 后想 T2 换脑子, 切 T1 后先将 T3 暴力写完然后安心想 T2. 由此观之并无太大的策略失误.
# 20241231 总结
## T1(a) [最小生成树] [边分治]
期望:30 实际:15 难度:3.5 用时:**2h**
在 ``struct`` 中不应开 $O(n)$ 的数组, 而应当专门将这个二维数组提出来, 否则访问非这个二维数组的元素时也需跳 $O(n^2)$ 的地址, 大幅增加了常数. 例: 图论中的 $dis_{x, y}$ 不应与 $e_{x, i}$ 放在同一个 ``struct`` 中.
对于一类最小生成树最优化问题, 若边数为 $O(n^2)$ 级别, 则不得不使用 Boruvka, 但若发现中途需要使用点分树或边分树来解决找最优边的问题, 则可以直接舍弃掉 Boruvka 算法, 而考虑如下性质: **一条边若在某一个最小生成树方案中, 则对于任意的包含了这条边的边集的边导出子图, 一定存在一种其的最小生成树方案包含了这条边.** 则可以在点分治/边分治时考虑所有跨过不同子树的边的导出子图形成的最小生成树的边集一定会在哪些边中选择 (此时一般需要猜测一个结论并使用经典的最小生成树调整法来证明最优性), 将 $O(n^2)$ 条边缩减为 $O(连通块大小)$ 条边, 则总共仅剩下 $O(n \log n)$ 条边.
使用边分治时需要三度化 (需要保证新树上两点的距离等于原树两点的距离). 方法为对于一条边 $(u, v, w)$, 开一个新点 $n+1$, 在新树上连边 $(u, n+1, 0)$ 与 $(n+1, v, w)$, 然后将 $u$ 的其他边放在 $n+1$ 上继续进行此操作.
## T2(b) [观察力] [Slope Trick] [计数第 k 大] [不会]
期望:60 实际:60 难度:5 用时:2h
对于一类密铺区间的贪心问题 (如给一个人做菜的时间为 $a_i$, 吃饭的时间为 $b_i$, 一次只能给一个人做菜, 多个人可以同时吃饭, 最小化总用时), 若按值域顺序不好考虑则尝试逆序.
对于一类求 $[1, m]^n$ 的所有方案中的第 $k$ 小的和的计数问题, 除了暴力枚举第 $k$ 小的具体值, 有一类扩展性更强的 Dp 方式为设 $f_{i, j, l, r}$ 表示考虑了 $i$ 个元素, $l$ 为第 $j$ 小且 $r$ 为第 $j+1$ 小的方案数. 转移考虑新数与 $l$ 和 $r$ 的三类关系即可.
剩余部分还不会.
## T3(c) [观察力] [分类讨论] [莫比乌斯反演] [推式子]
期望:20 实际:20 难度:3.5 用时:0.5h
对于一类询问一个数能否表示成 $a \times b^c$ 的形式的问题, 由于 $c$ 对复杂度以及分类讨论数量的影响较大, 应当先确定 $c$ 的取值范围.
对于一类计算 $O(1)$ 个较大集合的并的问题, 考虑按集合大小从大往小计算, 每次需要剔除掉已经在前面出现过的元素. 这样可以平衡枚举元素与剔除的复杂度.
计数 $kx$ 没有平方因子的 $x$ 的数量可以将限制条件拆成 $k$ 与 $x$ 分别没有平方因子且 $k$ 与 $x$ 互质, 随后使用莫比乌斯反演加预处理容易解决.
## 结算
猜到了 T1 的结论, 但由于不会证明一直不敢写, 事实上实现的难度是不高的, 也即性价比很高, 应当尝试.
在拼 T2 的暴力上花费了较长时间, 而且明知 T2 是一道看了题解都还不会的原题, 依旧尝试思考了一段时间正解.
# 20250102 总结
## T1(a) [观察力] [线段树]
期望:100 实际:100 难度:1.5 用时:**1.5h**
很显然的性质: 杀一只怪需要至少 $a_i$ 的等级, 杀完获得 $b_i$ 的等级, 最小化杀 $k$ 只怪的初始等级, 则杀的怪是 $a_i$ 最小的 $k$ 个.
对于一类与前缀按顺序合并有关的贡献, 显然可以用线段树维护.
## T2(b) [问题刻画] [推式子] [扫描线]
期望:43 实际:43 难度:3 用时:**2h**
对于一类最长下降子序列长度不超过 2 的限制, 若需要刻画问题以寻找性质则将元素分为是前缀最大值和不是前缀最大值两类, 若需要判断合法条件则考虑每个元素的 $pre$ 和 $nxt$.
对于一类明显需要得出一个能够 $O(1)$ 计算的式子的计数问题, 可以先考虑一个较为暴力的多项式 Dp, 再转化考虑它的组合意义. 事实上与 HNOI Day 1 T3 的部分思想一致.
范德蒙德卷积有两种形式, 常见的为 $\sum_i {n \choose i} {m \choose k-i} = {n+m \choose k}$, 另一种为 $\sum_i {i \choose n} {k-i \choose m} = {k+1 \choose n+m+1}$.
## T3(c) [组合意义] [生成函数]
期望:35 实际:35 难度:3.5 用时:1h
对于一类序列计数问题, 若一个下标 $i$ 满足某些条件时权值会乘上 $a_i$, 则有两种方式可以刻画这个问题. 一是使用组合意义变为在 $a_i$ 个互不相同的球中删去一个, 二是使用生成函数变为求导.
对于一类进行 $n$ 次操作, 每次加入或删去恰一个元素 (所有曾出现过的元素都互不相同), 计数从 $s$ 个元素变为 $t$ 个元素的方案数的问题, 考虑枚举 $s$ 个元素与 $t$ 个元素的交集大小, 则可以线性计算.
对于一类形如 $F_i = F_{i-1}P + F'_{i-1}$ 的生成函数的递推式, 其中 $P$ 为常多项式, 考虑设 $G_i = F_i e^Q$, 使得 $Q' = P$, 则有
$$
\begin{aligned}
G'_i&=(F_ie^Q)'
\\
&=F_iQ'e^Q + F'_ie^Q
\\
&=G_{i+1}
\end{aligned}
$$
则可以方便地计算 $F_n$, 将 $e^Q$ 泰勒展开即可.
## 结算
在 T1 上花费了过多时间来思考 Dp 以选取 $k$ 个最优的敌人, 以至于最终的结论都是通过 Dp 得出的, 导致没有时间思考 T2. 事实上若有额外的一个小时则 T2 应当是能够想到的.
T2 在找规律上同样浪费了大量时间. 事实上对于我来说与组合数相关的规律较难找到 (即使只是一个卡特兰数), 应当直接思考上文提到的 Dp 转组合意义以得到式子.
好在 T3 简单的双阶乘找规律不难看出.
# 20250107 总结
## T1(a) [剪枝]
期望:50 实际:50 难度:2.5 用时:**3h**
毫无意义的题目.
对于一类随机数据中的 Dp 问题, 可以考虑剪枝. 方法为考虑状态中最稀疏的一维将其与 Dp 值的 ``pair`` 放进去掉了这一维的阶段中, 将无用的 ``pair`` 删去. 具体地, 考虑两个 ``pair`` 的转移, 若无论转移是什么, 其中一个都劣于另一个, 则可以删去. 一般形如二维偏序, 则排序后直接做即可.
## T2(b) [分析同等地位] [生成函数] [多项式] [背包]
期望:18 实际:18 难度:3.5 用时:1h
计数问题中若一些 A 类元素用到的同等地位的 B 类元素数量相等, 转移方式相同, 则能够推出这些 A 类元素也处于同等地位, 则只需记录数量而无需记录编号集合.
通过求导生成函数并不仅能求解 $F = G^n$ 的递推式, 事实上能够求解大量形如 $F = G^n H^m ...$ 的递推式.
对于一类多重背包, 若物品的体积形成链状倍数关系, 则应当从大到小考虑每种物品来 Dp, 每次转移后应当放大坐标轴. 可以使复杂度少一个 $\log$.
## T3(c) [离散化] [扫描线] [线段树] [势能分析]
期望:20 实际:0 难度:4.5 用时:0.5h
写代码途中扩大了一个二维数组的使用范围, 但多测清空的对应地方并没有作对应的修改. 同时在求解最长极长段 ($\text{ans2}$) 时判断上一个段是否同样是极长连续段时少了一个条件.
离散化区间时应当先将区间转化为左闭右开的形式. 矩形同理.
对于 $x$ 轴与 $y$ 轴不等价的扫描线问题, 从哪一侧扫描一般可以根据直觉.
线段树单次操作中若需要对不同的连续段分别操作 (在使用线段树获取此时的关键区间以继续进行下一步操作时常见), 则若能保证之后会立即将这些连续段合并, 复杂度依旧正确.
扫描线中若需要统计以当前的时刻作为上边界的极长的被覆盖连续段, 则若按题目给的矩形来区间 +1/-1, 应当在最后拿当前所有区间的并来查询, 而不能修改完立刻以修改的区间查询. 更好的方式是计算出当前所有区间覆盖数轴的分段函数, 并用若干个要么包含要么不交的区间来等价变换, 这样就可以在修改完立刻以修改的区间查询.
## 结算
在 2h 时刻就已经写完了 T1 的 50pts 做法, 但心存执念想要继续剪枝以获得更高分数, 而徒劳了 1h. 事实上由于此类 Dp 剪枝的题见的不多, 当时应当立即去想 T2.
# 20250109 总结
## T1(a) [线段树] [树链剖分]
期望:100 实际:100 难度:2 用时:1.5h
若需要维护若干区间是否合法, 且合法条件所涉及到的元素集合 (例如单调递增涉及到的元素集合就是所有相邻元素的二元组) 较少, 则可以直接维护每个元素集合的合法性, 而无需对每个区间分别判断是否合法.
例如, 维护二叉树上每个子树是否是 BST, 与其使用线段树维护中序遍历中区间是否单调, 不如对于一对相邻的不单调的数, 将其的 LCA 到根的链全部设为不合法.
对于一类动态增删点, 维护所有点到根的路径的并的大小的题目, 显然可以树链剖分, 但更好的做法是维护 $\sum_{i=1}^k dep_{s_i} - \sum_{i=1}^{k-1} dep_{Lca(s_i, s_{i+1})}$, 其中 $s_i$ 为点集按 dfn 排序得到的序列.
当需要判断相等的字符串都等长时, 可以用 SAM 上对应的节点来代替哈希.
## T2(b) [状态压缩]
期望:75 实际:45 难度:3 用时:2h
对于一类需要动态维护逆序对个数的 Dp, 若决策的是每个位置选或不选 (或言之选取的是一个排列的子序列), 则无需维护前面的数的集合, 只需维护后面的数将值域分割成的每一段内选择的数的个数即可. 相比于前者 $O(2^n)$ 的状态, 后者的状态数是将 $n+1$ 划分成若干个数的和后这些数的乘积的最大值, 最劣情况下是 $O(3^{n/3})$$.
## T3(c) [分块] [SAM] [扫描线]
期望:30 实际:30 难度:4.5 用时:1h
对于一类区间询问这个区间内的前缀的贡献和的问题, 可以考虑分块, 将前缀分为跨过了区间内第一条分块线的和没跨过的来分开做.
## 结算
下考前 10min 意识到 T2 的随机数据可以给暴搜加上最优化剪枝, 但由于考场上运气过好, 造的唯一一组大样例跑的飞快便认为足以通过, 从而浪费了 5min 的继续卡常的机会.
测试运行时间时若程序使用了随机化或极度依赖数据, 应当多测试几组.
# 20250113 总结
## T1(a) [双指针] [堆]
期望:100 实际:100 难度:2 用时:1.5h
形如 可以有 $k$ 个位置不同 的字符串匹配无法使用 KMP, 可使用双指针做到 $O(n^2)$, 似乎还能用多项式做到 $O(n \log n)$.
当需要维护最大值的集合内元素值域较小, 且最大值每次增加量 (或最小值每次减少量) 为 $O(1)$, 则可以维护每个值在集合内的出现次数和最大值, 做到均摊 $O(1)$ 维护 (若两个条件均满足则为严格 $O(1)$).
## T2(b) [势能分析] [启发式合并] [链表]
期望:30 实际:30 难度:3 用时:0.5h
若序列中的数只会减少, 则前缀最大值的总变化量 (包括了集合和值的变化) 是 $O(n+q)$ 的.
若发现某个过程中每一步之间满足一些性质 (如序列上的数分别单调不增, 答案单调不增), 则应保证维护每个步骤的途中同样满足性质 (如启发式合并的途中插入到一半时也应当满足).
特别地, 维护全局最优化答案时, 若想要利用答案单调的性质只维护最优值而不维护堆, 应当保证中途不会产生非法的答案, 即使之后会将这个非法答案移除.
已知插入的数的前驱时, 可以使用链表来模拟 ``set``.
## T3(c) [观察力] [长链剖分] [分类讨论]
期望:42 实际:42 难度:4 用时:2.5h
树上追逐游戏 (移动步数 **不超过** 某个值, 可以不动) 的输赢判定考虑分类讨论双方最大步数和树的直径的关系, 比较板.
若使用长链剖分, 则不应当有过于复杂的转移 (如前缀和相关等).
一种简化转移的方式是通过分类讨论分为少量可以暴力做的部分, 和可以不考虑与值域较小的数组 (如儿子的 Dp 数组) 有关的转移的部分.
实现上, 若对于同一份值使用了多个变量来维护 (如维护了 Dp 值的和, 乘法标记, 乘法标记逆元等), 应当写一个函数来实现修改值, 能够更加简洁, 且小幅降低常数.
## 结算
T3 的 $O(n^2)$ 暴力直到下考前 10min 才写完. 原因是 Dp 转移时为了防止越界而增设的边界判断写错了很多, 且修改转移时没有同步修改边界判断.
T2 的 $O(n^2 + q \alpha(n))$ 暴力是容易在 10min 内实现的, 事实上应当先实现了这一暴力再去拼 T3 的部分分, 而不是在写完 T3 后的最后 10min 来写. 险些翻车.
# 20250117 总结
## T1(info) [观察力] [虚树] [Dp]
期望:100 实际:55 难度:2 用时:**2.5h**
难度集中在读题. 没有写完正解, 60pts 的暴力在合并自己与所有儿子时写错了, 不应当将合法的概率相加而应当是 1 - 不合法的概率之积.
对于题目中没有加以解释的伪代码, 应当特别留意自然语言的部分, 以及一条语句的作用域.
对于树上一类边概率存在的连通性问题, 若最终的问题只与所有点与根的连通性相关, 则可以设 $f_x$ 表示 $x$ 子树内所有点与 $x$ 的连通性满足题目限制的概率. 如询问根与 $S$ 内点集中至少一个连通的概率, 则令 $a_x = [x \in S]$, $f_x = 1-(1-a_x)\prod_{i \in Son_x} (1-f_iw_i)$, 其中 $w_i$ 为 $i$ 与父亲的边存在的概率, 答案为 $f_{root}$.
对于一类多次指定每个点初始值的相同树上 Dp 问题, 若合并一棵初始值均为默认值的子树对 Dp 值不造成影响, 则可以将初始值不为默认值的点拿出来做虚树.
## T2(calc) [生成函数]
期望:100 实际:100 难度:2 用时:1h
若生成函数的式子中出现了无穷求和或可转化为无穷求和的部分 (如 $\prod_i \sum_{j=0}^{\infty} F_{i, j}$), 考虑将无穷求和转化为有限的多项分式.
## T3(perm) [贪心] [杨表] [Dp]
期望:50 实际:40 难度:3.5 用时:1h
贪心地判断合法假了. 事实上将从前往后改为从后往前就对了.
对于一类需要维护一个杨表状的东西 (包括单调不降的序列等可视为杨表的东西), 且转移与之相关的 Dp, 若不好直接维护则考虑将其转置.
## 结算
几乎全机房都看错 T1 了约 2h. 所幸在 1h 后便放弃了 T1 并很快的切了 T2.
T3 对于暴搜的复杂度判断错误, 导致无效地拼了很多暴搜本身能跑过的部分分, 浪费了约 0.5h.
# 20250121 总结
## T1(mo) [推式子]
期望:100 实际:100 难度:1 用时:1h
注意分类讨论的全面性. 如 $s$ 在区间 $[l, r]$ 内与不在区间内, $x=1$ 与 $x \neq 1$.
## T2(frog) [随机游走]
期望:100 实际:100 难度:2 用时:1h
当带取模的题目中需要进行形如 ``a -= b * c`` 的操作时, 正确的写法应当是 ``a = (a - b * c) % kMod``, 即使可能会使 $a$ 变为负数, 并在输出时使用 ``(ans + kMod) % kMod``. 几种不优的写法为: 在式子的末尾加上一个 ``kMod * kMod`` (有可能爆值域且慢), 或对于可能变为负数的变量在调用时使用 ``( + kMod) % kMod`` (有可能找不全这样的变量且慢), 或在取模后立马 ``( + kMod) % kMod`` (慢).
对于一类 $f_i = af_{i-1}+bf_{i+1} (1 \le i < n)$, 其中 $f_0$ 与 $f_n$ 给定的递推式, 可设 $f_i = s_if_{i+1}+t_i$, 从小到大递推 $s_i$ 与 $t_i$ 再从大到小还原 $f_i$ 即可. 特别地, 当 $f_0 = 0$ 时有 $t_i = 0$.
## T3(hod) [半平面] [扫描线] [操作分块] [线段树分治] [标记回收法] [[最优范围修改查询](https://www.luogu.com.cn/article/n503cwfy)]
期望:50 实际:50 难度:5 用时:2h
平面几何中要注意 **平行线** (在做半平面交时极其致命) / 三点共线 / 两线重合 的问题.
对于一类对一个区间中的集合的交进行操作的题目, 可以进行扫描线, 维护每个元素最大的不在里面的集合编号, 每次将集合外的元素赋为当前集合的编号, 操作时在 $r$ 考虑所有值 $< l$ 的元素.
对于一类 $O(m)$ 个范围操作 (如半平面加或矩形加) 会将元素 (在上例中为一个可能被查询到的坐标) 划分为 $O(m^2)$ 或更多个等价类 (以平方为例) 的问题, 若总的元素个数为 $O(n)$, 且 $m$ 远大于 $\sqrt n$, 则考虑将这些范围操作按 $\sqrt n$ 的块长分块, 则此时块内 $O(m^2)$ 个等价类是可以接受的, 其至多不超过 $O(n)$.
分块后, 对于上述的问题, 一般的解决办法为使用线段树分治, 递归时将另一边的区间内的范围操作删去, 即合并若干等价类, 回溯时再撤销这些合并等价类的操作, 在叶子上对于需要操作的 $O(1)$ 个等价类打标记.
事实上等价类的合并关系可以看成一棵森林, 则相当于每次对合并若干个根, 某个根打标记, 删除根并分裂成若干棵树, 下传标记. 容易发现此时满足给一个点打标记时祖先都没有标记 (毕竟没有祖先), 则每次打标记后将子树内的标记清空 (或言回收, 名字的来历), 在新增标记或删除标记时维护需要维护的东西即可.
## 结算
本场有较多实现上的失误, 均在上文中有体现.
对于交互题的框架并不熟练, 在调整交互库与接口上花费了约 0.5h, 并使用了一些帮助.
# 20250206 总结
## T1(a) [Dp of Dp] [简化状态]
期望:72 实际:36 难度:3.5 用时:2h
为了写更快的代码而没有写一个已经会了的 Sub, 但并未在下考前写完, 且数据分治时出现了错误.
对于一类值域的转移存在拓扑序的最优化 Dp, 若只关心最后一个位置的 Dp 值, 可以将值域与其中一个下标交换, 而无需满足 Dp 值单调.
对于一类预处理从 $x$ 往后的连续数对 $(a_i, a_{i+1})$ 中恰为 $(y, z)$ 的 $i$ 的最小值的问题, 直接预处理则时空均为 $O(nv^2)$. 可以考虑预处理从 $x$ 往后的第一个 $y$ 的位置, 和从 $x$ 往后的连续数对 $(a_i, a_x)$ 中恰为 $(y, a_x)$ 的 $i$ 的最小值, 时空复杂度均为 $O(nv)$.
## T2(b) [等价转化] [线段树合并]
期望:50 实际:25 难度:4 用时:2h
数据分治后在其中一个 Sub 忘记判不合法.
对于一类若干人排队互相堵的模拟问题, 考虑一个人被堵若干次等价于对于每次被堵分别考虑, 钦定这是这个人唯一一次被堵. 然后对于每条边计算所有经过的人通过时刻的最大值.
## T3(c) [观察力] [简化状态] [简化转移]
期望:0 实际:0 难度:4.5 用时:0.5h
原题, 同 20240514 T2 snow, 故考场上没有看.
对于一类 Dp 值非仅有 01 的维护了四个边界的矩形 Dp, 考虑所有需要的 Dp 值是否其中一个边界全部相等或可以变化到相等, 则可以简化状态.
对于一类有 $O(n^2)$ 或更大复杂度的转移的 Dp, 考虑不被偏序的决策是否较少.
## 结算
数据分治最失败的一集.
当有会的 Sub 后先确保能拿到这个 Sub 的分数, 尤其是快下考时.
# 20250208 总结
## T1(a) [观察力] [分类讨论] [背包] [决策单调性]
期望:100 实际:100 难度:3 用时:3h
对于完全背包问题, 若所有物品的重量的最大值为 $w$, 则当背包容量 $\ge w^2$ 时, 最优方案一定包含了至少一个性价比最高的物品, 则可以将背包容量缩减到 $w^2$ 范围内. 证明考虑 $w$ 个数一定存在一个非空前缀使得和为 $w$ 的倍数.
对于一类定义域极大而不好枚举求最大值的函数, 考虑能否通过数学分析找到最大值. 如 $f(x) = \frac{a}{x} + bx$.
## T2(b) [搜索] [构造]
期望:0 实际:0 难度:4.5 用时:**1h**
构造题应当写一些显然的特殊性质或者写一个暴搜 (尤其是给了暴搜分的时候) 就过. 不应浪费太多时间.
事实上存在一类构造题的正解就是通过暴搜得到很好的构造, 再将若干暴搜得到的构造组合在一起.
## T3(c) [逆向变换] [观察力] [树状数组]
期望:15 实际:15 难度:4 用时:0.5h
对于一类正向维护序列的变化, 则一次操作就需要 $O(n)$, 但查询是单点询问的题目, 考虑逆向变化, 并只维护这个单点的值.
树状数组也支持二分. 具体来说, 将树状数组的范围补全至 2 的幂, 然后从尾向头倍增.
## 结算
直到过了 T1 才开始看后面的题. 或许在对题目很有把握时不失为一种策略.
在构造题上死磕了 1h, 但毫无收获, 甚至正解与特殊性质毫无关系.
# 20250211 总结
## T1(a) [集合 Dp]
期望:100 实际:0 难度:2 用时:1h
没有判无解.
使用集合 Dp 确定树的形态时, 拓扑序为 popcount.
## T2(b) [数位 Dp] [势能分析]
期望:44 实际:36 难度:2.5 用时:1.5h
贪心的拿物品填满背包时, 使用了一个物品之后没有将这个物品删除, 又因为想要尽可能简短的实现而导致一个物品使用多次.
对于一个极大数 $M$, 进行 $n$ 次 +1 后, 进位的总次数是 $O(n + \log M)$ 的.
进位有关的数位 Dp 也可以从高往低做. 具体地, 将状态中记录的进位数改为钦定前面需要进位的数量.
## T3(c) [哈希] [伪素数分解]
期望:30 实际:30 难度:4 用时:**2h**
对于一类在序列上选取若干个互不相交的区间的条件, 若允许的复杂度较大 (如 $O(n^2)$), 则应当直接考虑 Dp.
哈希可重集时, 一种愚蠢的做法是将可重集内可能出现的每个元素赋编号, 然后使用进制哈希. 更为聪明的做法是将可重集内可能出现的每个元素赋权值, 然后全部相加. 好处在于支持的模数更大 (从 $10^9$ 变为了 $10^{18}$, 不需要为了扩充值域使用双哈希), 且常数更小 (不需要乘法运算).
当需要判断若干值域极大的数相乘的结果是否是 $k$ 次方数时, 无需质因数分解分别判 $k$ 的倍数, 只需确定一个集合 $S$ 满足 $x \in S \Rightarrow \forall i \ge 2, x^{\frac{1}{i}} \notin \Z$ 且 $x \in S, y \in S, x \neq y \Rightarrow \gcd(x, y) = 1$, 且每个需要用到的数都能用若干集合里的数的乘积表示, 然后用这个集合来对每个数做伪素数分解即可. 具体构造考虑插入一个数, 则枚举集合内的数, 同除 gcd 并将 gcd 插入. 显然集合大小为 $O(n \log V)$ 的.
## 结算
面对 $O(n^2)$ 计数合法的不交的区间对的时候唐了 0.5h.
面对 T2 时没有自信想出正解, 从第一个 Sub 开始想, 而且时间不足以拼足够多的暴力.
写完代码后应当将题面重新阅读一遍, 以防止没判无解等情况.
# 20250212 总结
## T1(a) [竞赛图] [Tarjan]
期望:100 实际:75 难度:2.5 用时:**3.5h**
犯了大量错误, 甚至还能有 75pts.
- 当一个连通块的贡献与连通块大小有关时, 缩点完应当动态维护连通块大小.
- 依据补图的连通性缩点时, 应当维护每个连通块的大小和连通块间边的数量, 以用边数和两侧大小之积的关系判断补图是否存在边.
- 当需要多次缩点时 (以两次为例), 第二次应当只对第一次的代表元缩点, 并更新每个点的代表元为第一次的代表元的第二次的代表元, 或者直接使用并查集维护代表元.
- 当代码中需要特判时 (如大小为 2 的连通块贡献为 2 而非 1), 应当检查是否每个地方都进行了特判, 尤其是隐形的使用了不需要特判的性质时 (将贡献和直接设为连通块数量), 尤其是这个特判是在代码写完调试的时候才发现时.
根据一张图的补图 (无向图) 来缩连通块可以做到 $O(n+m)$. 具体的, 找到度数最小的点, 将它和所有非邻居缩在一起, 则原图只剩 $O(\min(n, \frac{m}{n})) = O(\sqrt m)$ 个点, 随后暴力缩连通块即可.
一张竞赛图只要还未被定向的边将整张图连通, 则一定存在一种定向所有边的方案, 使得图是强连通分量.
竞赛图一定存在一条欧拉路径. 具体地, 考虑归纳证明, 并尝试将新点插在原路径的每一个缝隙里.
## T2(b) [方案数转概率] [概率论]
期望:27 实际:27 难度:3.5 用时:0.5h
似乎大部分计数合法方案数的题目转化为合法概率都是不劣的, 如 20241114 T3.
若一些随机事件两两之间的影响均只会发生一次 (构成一棵树), 且不关心发生影响后一条边两侧的两个随机事件的条件概率 (包括同时发生或同时不发生等的概率), 则可以视为每个随机事件始终彼此独立. 显然此时更新受到影响后的概率所用到的值只有一条边的两端点的概率.
例如, 树上每个结点有 $p_i$ 的概率独立的产生一个石头, 按编号顺序考虑每个结点, 若其非根且有石头且父亲没有石头则将石头移到父亲, 求考虑完之后每个点上有石头的概率. 则任意时刻都可以认为所有结点有无石头是独立的, 因为发生传递之后可以将这条边断开, 之后可以不再考虑跨连通块的点对的影响.
当两个随机事件不独立时, 计算由这个局面得到的其他局面的概率可以枚举两个随机事件在随机空间中的具体取值, 并对每种情况带权求和. 事实上就是暴搜.
## T3(c) [贪心] [模拟费用流]
期望:42 实际:5 难度:5 用时:0.5h
特殊性质的 slope trick 和 wqs 二分都很板, 但并没有时间想和写.
证明答案的凸性可以考虑使用费用流建模, 或者依据特殊性质的提示直接猜测答案具有凸性.
## 结算
感觉对于图论中连通性相关的题目极其容易写挂. 缺乏练习了.
# 20250216 总结
## T1(a) [最小权点覆盖]
期望:100 实际:100 难度:2.5 用时:**2.5h**
在具有特殊性质的二分图上 (如左部点连的边是一个区间), 最大权独立集比最小权点覆盖好求, 因为需要考虑的贡献较少, 而且能将非正权删去.
对于一类对若干区间依次决策是否选择的 Dp, 若包含同一个点的所有区间要么同时选择要么同时不选, 则考虑对离散化后的坐标进行 Dp.
## T2(b) [划分关键点] [线段树]
期望:50 实际:50 难度:3.5 用时:0.5h
对于一类相等长度不断往后匹配若干次 (如求后缀的周期, 或匹配形如 AABB 的串) 的题目, 可以枚举这个长度 $l$ 然后定长的设定 $\lfloor \frac{n}{l} \rfloor$ 个关键点, 一段中合法的位置可以通过 lcp 和 lcs 表示成 $O(1)$ 段区间, 随后用数据结构维护答案即可. 如 P1117 优秀的拆分.
## T3(c) [容斥] [根号分治]
期望:35 实际:35 难度:4 用时:1h
对于一类 $m$ 全局固定, 求 $\sum_{i=1}^n f(i)^m$ 的式子, 可以使用 $x^m = \sum_{i=1}^x {x \choose i} \sum_{j=0}^{i-1} (-1)^j {i \choose j} (i-j)^m = \sum_{i=1}^x {x \choose i} g(i)$, 意义为枚举 $m$ 个指针指向的结点个数, 然后容斥计算方案数. 从而将原式变化为枚举值域计算取值点个数 (需要带上 $x \choose i$) 然后累加 $g$ 的问题, 成功消去了 $m$ 次方.
对于一类对所有 $z$ 求 $f(\lfloor \frac{n}{z} \rfloor) = \sum_{x^2 \le \lfloor \frac{n}{z} \rfloor} \lfloor \frac{n}{x^2} \rfloor g(x)$ 的问题, 考虑在枚举 $x$ 后枚举 $z$ 与 $\lfloor \frac{n}{x} \rfloor$ 中较小的一项 (即根号分治) 做到 $O(\sqrt n \log n)$.
## 结算
T1 在发现直接对区间 Dp 没有前途后, 想了近 1h 的网络流/费用流 和 hall 定理. 事实上应当着手于对 Dp 的优化的.
T2 想到了优秀的拆分, 但并没有想到使用数据结构维护. 感觉这个 Trick 的题现在难点是使用了 Trick 之后的部分.
# 20250218 总结
## T1(a) [区间 Dp]
期望:100 实际:100 难度:2 用时:1.5h
对于一类每次删去一个数, 将左右两边重新拼接的区间 Dp, 状态应当钦定左右端点都没有被删去, 以在转移时不产生无法确定的贡献.
区间 Dp 的转移方式应当从最简单的开始想. 比如枚举第一个/最后一个位置, 将两个区间拼起来.
## T2(b) [观察力] [兔队线段树]
期望:30 实际:30 难度:3 用时:1.5h
对于一类可以在数轴上自由移动, 但在某些时刻必须位于一个区间内, 最小化移动距离的题目, 若所有区间有交, 则贡献关于初始位置是一个斜率为 -1, 0, 1 的三段函数, 否则一定存在一个时刻 (即前缀交与当前区间无交的时刻) 无论初始位置在哪里都会走某个位置.
## T3(c) [哈希] [分类讨论] [线段树]
期望:10 实际:10 难度:4 用时:1.5h
计数题应当先观察大样例看答案的量级.
对于一类类似逻辑推理的条件 (如通过这些信息能够唯一确定一种合法方案), 应当先考虑转化信息合法的条件, 一般需要分类讨论.
对于所有区间都包含点集 $S$ 中之一, 且不存在 $T$ 满足 $|T| \le |S|, T \neq S$ 使得所有区间都包含点集 $T$ 这一条件, 事实上即可以唯一的确定出 $S$, 可以转化为对于 $S$ 中每个元素 $x$, 尝试将它修改为前驱和后继 (一般为 $x-1$ 和 $x+1$), 判断新的 $S'$ 能否覆盖所有区间. 当 $|S|$ 大小只有 $O(1)$ 时, 可以手动分类讨论并进一步得出更详细的判定条件.
对于给出地位对等的两个元素对的合法条件的问题 (比如上文的 $|S| = 2$), 可以先只考虑对于 $x$ 来说 $y$ 合法的条件, 随后同理求得另一半条件即可.
对于一类 $x$ 满足条件的后继大于某个定值 $t$ 的限制, 可以转化为 $(x, t]$ 内不存在满足条件的位置.
## 结算
T1 想了 1h 在区间 Dp 内套一个序列 Dp 来得到左端点杀掉的所有数的位置, 在此之前甚至没有想过枚举最后一个被杀的数的位置.
T2 没有观察到上文的性质, 而是用是否发生了移动来作为单侧递归的依据, 导致线段树中需要 23 个 tag, 而放弃了思考和实现 T2. 事实上观察到这个性质后只需要 11 个 tag 即可. 想到一个复杂度正确的做法并不代表正解是这个做法, 可以通过进一步观察来降低实现复杂度.
T3 想到了一个基于容斥的假完了的 $O(n^3)$ 做法, 在此浪费了 1h. 应当先用这个做法手玩样例来判断是否可行的.
# 20250220 总结
## T1(a) [观察力] [前驱树] [倍增]
期望:100 实际:100 难度:1.5 用时:1.5h
对于一个序列, 若将 $i$ 与 $i$ 的前驱看作一个区间, 则区间不会严格包含与严格相交 (指端点需要互不相同), 证明考虑分类讨论两个数的大小关系. 若将 $i$ 向 $i$ 的前驱连边, 则会得到一棵树, 且每一条链都是单调的. 在一些不断跳跃前驱的题目中可以用到. 同理有 Border 树.
随机排列中前驱树的深度是 $O(\log n)$ 的. 对于一类数据随机多次询问的题目, 考虑将一次询问涉及到的元素从 $n$ 粗略的过滤到一个更小的值 (如前驱树的深度), 然后写程序验证其的量级.
对于归并排序 (以升序为例) 两个有序序列的操作, 查询第 $i$ 次移动指针后两个指针分别的位置可以做到 $O(\log n)$. 具体地, 二分或倍增下标 $x$, 需保证 $2x \le i$, 判断考虑 $a_x$ 与 $b_x$ 的大小关系, 若 $a_x < b_x$, 则 $a_x$ 在归并后的排名 $< 2x \le i$, 故可以删去 $a_i$ 的前 $x-1$ 项, 反之同理. 二分复杂度为 $O(\log_2 n)$, 倍增复杂度为 $O(\log_{\frac{4}{3}} n)$.
## T2(b) [SAM] [树形背包] [重链剖分] [DDp]
期望:40 实际:40 难度:3.5 用时:1.5h
同 20241208 T2 string. 正解实现难度极高, 故考场上没有写.
对于一类选取 $S$ 的若干子串, 满足 LCS 的某些限制的题目, 考虑使用 SAM.
将 $S$ 的 SAM 建立后, $S$ 的一个前缀对应的 SAM, 一定是这个 SAM 的某棵虚树. 或言之, 前缀往后移动只会在当前 SAM 的一条边中插点, 或插一个叶子. 故重链剖分维护 DDp 是容易的.
## T3(c) [贡献差分] [自动机展开] [格路计数]
期望:30 实际:30 难度:4 用时:1h
对于一类计数题中带权的贡献, (如选取到排列中的 $i$ 贡献为 $w_i$, 整个贡献为选取到的所有数的贡献之和), 若权值的值域较小, 则可以枚举权值, 计算贡献至少为这个值的方案数, (如计算每种方案选取到 $w_i \ge t$ 的数量之和).
对于一类 $\forall 1 \le i \le n, ans \leftarrow ans + a_i, ans \leftarrow \min(ans, b_i)$ 的自动机形式, 若 $a_i \ge 0$, $b_i$ 单调不降, 则有 $ans = \min_{i=0}^n \{ b_i + \sum_{j=i+1}^n a_j \}$. 证明考虑 $ans$ 最后一次被取 $\min$ 的位置, 这个式子在这个位置取到最小值.
对于一类 01 序列计数问题, 考虑将前缀的 0 的个数, 1 的个数作为坐标, 将限制条件放在坐标系上, 转化为格路计数问题.
## 结算
T3 使用的 $O(n^3+qn)$ 做法完全没有用到贡献差分的技巧, 而是直接统计了每个数被选中的方案数, 并在这一思路上一直思考到下考. 事实上略加思考可以发现, 若正解是这样的思路, 则 $a_i$ 的单点修改毫无意义, 且无需保证 $a_i \le 10^6$. 不过能拿到的部分分都拿到了.
# 20250318 总结
## T1([a](https://www.luogu.com.cn/problem/P11918)) [背包] [分块] [FFT]
应得:75 实得:75 难度:2 用时:2h
随机的情况下最优化背包可以只维护期望容量周围根号个容量, 尤其是当输出形式为浮点数. 同 20240719 T2.
## T2([b](https://www.luogu.com.cn/problem/P11928)) [类本质不同子序列个数] [DDp] [分段转移]
应得:100 实得:100 难度:2.5 用时:2.5h
难点在于不要想矩阵乘法.
类似本质不同子序列个数的 Dp $f_i = 2f_{i-1} - f_{p_i-1}$, 有出现次数为 1 的子序列个数为 $f_i = 2\sum_{j \in \Sigma} f_{p_{i, j}} - \sum_{j \in \Sigma} [p_{i, j} < p_{i, s_i}] f_{p{i, j}}$. 事实上将它看作从最左侧的特殊字符走到最右侧的特殊字符的路径更好理解.
动态 Dp 不一定要求把 Dp 方程转化为矩阵乘法的形式, 只需要满足可合并性即可.
合并 $f_{i, j}$ 与 $g_{k, l}$ 时, 若贡献形式形如 若条件 $P(j, k)$ 为真则将 $f_{i, j} g_{k, l}$ 累加到 $h_{i, l}$ 上, 则可以先转移 $i, j, k$ 再转移 $j, k, l$ 做到 $O(n^3)$. 事实上可以视为将计算三个矩阵的乘积的过程, 从直接大力计算变为了分两步计算.
## T3([c](https://www.luogu.com.cn/problem/P11924)) [倒推] [观察力] [线段树分裂]
应得:33 实得:0 难度:4 用时:0.5h
时间不够了, 再多 0.5h 应当能够写出来.
当给定的序列值域很小的时候, 可以考虑按某种方式生成的序列值域同样很小.
## 结算
在想了接近 2h T1 后果断放弃, 没写分块的 75pts 代码就去想 T2. 成功避免了死磕一年的结局.
不要随便猜结论. 翔哥 T1 猜了一个单调性挂成了暴力分.
# 20250320 总结
## T1([a](https://www.luogu.com.cn/problem/P11923)) [观察力] [模拟]
应得:55 实得:55 难度:3.5 用时:1h
难度主要在于观察到一个毫无意义的性质和实现一个毫无意义的数据结构.
对于一类无穷次进行神秘变换的题目, 可以考虑一些简单的结构能够在变换前后保持不变, 然后考虑是否这些简单的结构涵盖了所有的情况.
## T2([b](https://qoj.ac/problem/10183)) [观察力] [单调栈] [线段树] [扫描线]
应得:100 实得:100 难度:3 用时:2.5h
对于一类判断最大子段和能否为某个特定区间的问题, 区间内的数应当取到最大值, 区间外的数应当取到最小值. 证明考虑修改一个数对于不同类 (分特定区间的子区间, 跨过特定区间的左右端点之一的区间, 左右端点都跨过的区间, 与特定区间无交的区间四类) 的区间的和的影响. 事实上值得推广的是这种证明方法.
对于两个限制 $i < j < nt_i$ 与 $a_i < w_j$, 其中 $nt_i$ 为 $i$ 之后第一个比 $a_i$ 小的位置, 观察到 $j < nt_i$ 等价于 $a_i$ 为 $j$ 的前缀的非严格后缀最小值, 故对于一个 $j$ 来说满足第一个条件的 $i$ 的 $a_i$ 单调递增, 故第二个条件可以转化为 $i < p_j$. 从而将二维偏序转化为了一维偏序. 能够转化的原因是 $nt_i$ 事实上蕴含了 $a_i$ 的部分信息, 故可以运用这个条件带来的额外限制.
## T3([c](https://www.luogu.com.cn/problem/P11921)) [二分答案] [观察力] [搜索]
应得:21 实得:21 难度:4 用时:1h
对于一类需要二分答案, 且需要以分数的形式输出答案的问题, 若可能的分数的取值数量很少 (比如当分母不超过 $n$ 时, 数量为 $O(n^2V)$), 则可以对所有可能的分数排序, 然后直接二分. 也可以先二分整数部分, 然后再二分小数部分. 显然小数部分只有 $O(n^2)$ 种, 故复杂度同样为 $O(\log n + \log V)$, 但无需那个极大的排序.
对于一类 $O(n!)$ 枚举每个元素的优先级然后做贪心的做法, 一种优化的思路为每次将所有元素按需要贪心的属性从优到劣排序, 并证明这一次一定只会取前 $O(1)$ 个 (如 2), 从而优化到指数级复杂度.
例如, 对于一类在每一行选一个等长的区间, 使得每一列至少有 1 个位置不是障碍且不被选, 最大化长度的问题, 显然的做法是枚举每一行的优先级, 然后对于每一行尽量靠前地选择区间. 事实上一定存在一个最优的方案, 使得将所有行按现在能选到的最左的区间的位置排序, 选取的是前 2 个区间之一. 证明考虑若前 2 个都没取, 则现在就可以立马把第一个取了而始终不改变局面的合法性.
## 结算
同样地及时放弃了 T1, 拯救了大量时间来切 T2.
# 20250325 总结
## T1([a](https://qoj.ac/problem/10184)) [观察力] [树形 Dp] [斜率优化]
应得:100 实得:100 难度:1 用时:1h
对于树上求一条最优路径的问题, 考虑对每个点求出它到子树内所有点的最优路径, 然后将两条路径拼在一起.
## T2([b](https://qoj.ac/problem/10182)) [整体二分] [分块]
应得:70 实得:35 难度:3 用时:**3h**
并未想到二分.
归并排序两个有序序列可以 (整体) 二分, 也可以双指针. 在分块或根号分治时有用. 具体地, 分块可以块内二分块间双指针, 根号分治可以分最小值小于根号和大于根号两种.
对于一类询问次数上界与信息熵相关的交互题, 考虑将问题分为多个方案数彼此独立的小块, 则将问题化为了若干个子问题, 只需要求解一个子问题的询问次数与子问题的信息熵相关即可. 比如通过比较两个数大小来还原树上拓扑序, 可以分为若干个 归并排序两个序列 的子问题.
估算 $\ln {n+m \choose n}$ 可用 $(n+m) \ln (n+m) - n \ln n - m \ln m = n \ln \frac{n+m}{n} + m \ln \frac{n+m}{m}$. 来自斯特林公式 $\ln (n!) \approx n \ln n - n + \frac{1}{2} \ln (2 \pi n)$.
## T3([c](https://qoj.ac/problem/10185)) [笛卡尔树] [李超线段树] [扫描线] [决策单调性]
应得:42 实得:19 难度:5 用时:1h
时间不够.
对于一类询问与一个区间有交但不互相包含的所有区间的问题, 考虑分包含了询问区间的左端点但不包含右端点和对称的两种, 对于第一种从小往大对右端点扫描线, 相当于每次查询包含了一个点的所有区间. 把区间打在线段树对应 $O(\log n)$ 个结点上, 则查询只需考虑路径上 $O(\log n)$ 个结点上的区间即可.
对于一类动态查询大量元素的不可合并的信息的问题, 考虑猜测决策单调性并使用二分栈.
## 结算
在写完 T2 的 35pts 做法后仍浪费了 1h 尝试优化. 想到了链套菊花会把自己的做法卡掉, 但错误地考虑使用类似 self-adjusting 的方式来防御这类 hack, 而没有想到二分.
# 20250327 总结
## T1(a) [费用流] [二分图匹配]
应得:35 实得:20 难度:3.5 用时:2h
比起写状压 Dp 更优先去优化 T3 的做法了.
对于一类一眼网络流的题目, 建模时应当选取一个尽量小的单位来描述限制. 如需要在网格图上走出若干条回路, 但是回路不点交且必须一直转弯, 不应考虑用一条流量来描述一个回路, 而应对每个格点考虑限制, 即要么没有边要么有两条互相垂直的边, 此后描述限制是容易的.
费用流的多路增广为计算出每个点的最短路, 然后重新 Dfs, 只允许经过 转移后仍是最短路 的边. 且无论使用的是 Primal-Dual 还是 SPFA, 都有可能出现 0 环, 故应当记录当前路径经过的点, 不能重复经过.
Primal-Dual 不一定跑的比 SPFA 快. 实际写费用流的过程中若被卡常了可以考虑使用另一种算法.
## T2(b) [点分治] [整齐化]
应得:30 实得:30 难度:4 用时:1h
对于一类树上给出若干个邻域, 点对合法条件为存在一个邻域包含了两点的问题, 可以用其他点的最大邻域减去两点距离来更新一个点的最大邻域, 这样相邻点的最大邻域的差距不超过 1, 从而将与整棵树都有关的限制变为只与两点间的链有关的限制, 从而可以使用点分治. 故对于一些一眼点分治的题目, 考虑怎么把限制放到两点的链上.
对于一类需要维护以一个变化量可正可负的量加上一个变化量固定的量为下标的附带属性的最值的问题, 考虑其附带属性关于下标的单调性与下标的最大变化量. 若具有单调性且最大变化量为 $O(1)$ 的, 即可简单地做到 $O(1)$ 的修改和查询. 如以整齐化后的最大邻域加上深度为下标维护深度最大值.
对于一类会算重且不好去重的计数题, 考虑会算重的原因, 并将这个原因当作额外的性质来给元素分类, 使得类间两两的贡献都是不会算重的. 如本题点对所在的邻域的中心有可能在第一个点所在的链, 也有可能在第二个点所在的链, 但如果在两条链上都行的话这两个点就必然都位于根的邻域内.
事实上点分治不难写. 不要给自己太大的心理压力.
## T3(c) [观察力] [构造]
应得:47 实得:47 难度:3 用时:2h
对于一类最小化查询次数的交互题, 考虑列出每种策略和分别的性价比 (即能够得知的信息量与查询次数的比), 尽量使用性价比高的策略, 并用剩下的策略来处理最后的边界.
实现上, 使用 stl 懒维护每个元素的附带属性时, 应当确保修改时更新了所有元素的附带属性. 如维护每个点邻居的度数和, 则增删边时应当更新两侧的点 **与两侧的点的邻居**.
## 结算
在硬刚前两道题 3h 后终于发现 T3 是最可做的题, 而若再多 1h-1.5h 则可以拿到 81pts-100pts. 确实应当在前半场就给每道题一段思考时间, 无论是多抽象的题, 比如交互.
# 20250401 总结
## T1(a) [DDp] [并查集]
应得:100 实得:100 难度:2.5 用时:1.5h
动态维护每个阶段的 Dp 值并不一定需要将 Dp 写成矩阵乘法的形式, 若 Dp 方程较简单, 仅有线性变换和与常数取 max/min, 则可以直接考虑增量带来的变化. 如动态维护 $f_x = a_x + \sum_{i \in Son_x} \max(f_i, 0)$, 当 $a_x$ 只会增加时, 并不需要树剖加线段树维护矩乘, 只需要把小于 0 和大于等于 0 的分开, 并写一个支持树上链加单点查的数据结构即可.
## T2(b) [观察力] [重标号] [DDp]
应得:75 实得:75 难度:3.5 用时:1.5h
对于一类形如在序列 $a$ 上选择两个下标 $i$ 和 $j$ 要满足 $i$ 和 $j$ 都在各自限制的范围中 (如 $i$ 在前一半, $j$ 在后一半) 且 $j-i \le m$ 的限制, 若一个元素的贡献只与和 $i$ 以及 $j$ 的相对位置有关, 则可以将 $a$ 复制一份 $b$, 平移下标直到 $a_1$ 与 $b_{m+2}$ 对齐, 则若钦定 $i$ 在 $a$ 中选, $j$ 在 $b$ 中选, 限制变为 $i$ 要在 $j$ 之后选, 则容易满足.
对于一类能够写出 答案的贡献简单但限制条件较多的式子 的计数问题, 考虑将式子用 Dp 实现而不是直接维护式子. 在需要动态维护答案时尤其有用.
## T3([c](https://codeforces.com/gym/105755/problem/B)) [观察力] [Exgcd] [构造]
应得:35 实得:35 难度:4.5 用时:2h
对于一类将 01 序列进行线性变换的神秘操作 (比如每次用 "001" 替换 0, 用 "01" 替换 1), 考虑将变化前后的 01 序列画成一条格路, 并观察两条格路 (变化前后的格路, 或题目中给出的两个 01 序列分别的格路) 围出的小格子. 如 [QOJ3040 Container](https://qoj.ac/problem/3040).
对于给定一些小格子的集合, 求两条格路恰好包络了这些小格子的问题, 若值域较小则可以分别求出右下轮廓线和左上轮廓线, 而不用真的用两条格路来包这些小格子.
## 结算
做构造题不能过于自信. T3 暴搜写到一半突然想到了一个做法, 便不加验证的转而写构造做法了, 最终不出所料的假了.
# 20250403 总结
## T1(a) [多项式] [分治]
应得:85 实得:85 难度:4 用时:2h
NTT 中预处理矩阵系数对常数的优化极大, 可以将用时缩短至一半一下.
[多项式前缀积系数](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## T2(b) [括号树] [扫描线]
应得:100 实得:100 难度:3 用时:2.5h
对于一类一次性跳过整个合法括号序列的操作, 考虑在括号树上刻画操作.
对于一类区间询问极长匹配括号的贡献的问题, 考虑用区间折线上最低点把区间分成两半, 则左半边只有合法的括号和不合法的右括号, 从右往左扫描线, 每次清空区间内贡献, 再把贡献放在左括号上即可. 似乎有在线做法, 但我不会.
## T3(c) [观察力]
应得:40 实得:0 难度:4 用时:0.5h
没有时间写了.
对于一类难以优化的最优化 Dp 方程, 可以考虑可能有贡献的状态的数量是否是极少的, 例如可以只考虑 $f_{i, j}$ 中固定 $i$ 枚举 $j$ 且满足 $j$ 不超过 $i$ 的最大值.
## 结算
T2 一开始没有把最后数据结构的部分想清楚, 一度想要写完暴力跑路, 但幸好被 T3 过于复杂的暴力劝退, 事实上数据结构的部分是不难的.
# 20250408 总结
## T1([a](https://atcoder.jp/contests/nupc2024/tasks/nupc2024_l)) [观察力] [贪心] [Dp]
应得:20 实得:20 难度:3.5 用时:0.5h
对于一类要求在第一关键字最小的情况下第二关键字最小的题目, 若第一关键字的答案容易求得, 则可以将第一关键字独立出去作为对决策的限制并刻画这一限制.
对于一类能按照下标贪心的题目, 大概率也能按照值域贪心. 比如本题的带权老鼠向左进洞问题和 [单点匹配区间问题](https://www.luogu.com.cn/article/ft3tx54e).
## T2([b](https://www.luogu.com.cn/problem/P11407)) [观察力] [二分凸包]
应得:100 实得:99 难度:3 用时:4h
将 ``-1`` 作为了不合法的返回值, 但合法的答案返回值也有可能为 ``-1``, 产生冲突.
若每次可以查凸包上一个 $x$ 对应的 $y$, 那么确定凸包的复杂度为 $O(n)$ 而非 $O(n \log V)$. 具体地, 可以以最左侧和最右侧的线段作为初始值, 每次计算两条线段所在直线的交点并查询凸包上与这一个点 $x$ 坐标相等的点的切线的斜率, 如果两条线段之间还有别的线段, 则一定能查到新线段.
## T3([c](https://qoj.ac/problem/6105)) [SAM] [分类讨论]
应得:5 实得:0 难度:3 用时:0.5h
因为过了下班时间于是不写暴力了. 难度主要集中在实现上的一堆边界, 但考场上甚至没有花时间想做法.
对于一类求字典序第 $k$ 小的题目, 最好的办法还是逐步确定前缀.
## 结算
除了 -1 的错误没有注意到从而直接拼暴力之外没什么失误. 但多给我 2h 或许能切 T3.
# 20250410 总结
## T1(a) [最短路] [观察力] [优化建图]
应得:100 实得:60 难度:3 用时:**4h**
线段树优化建图没有卡过去.
对于一类需要优化建图的最短路题, 如果有形如不能连续经过两个相同颜色的点的限制, 考虑是否有别的路径边权与这条边的边权相等, 若有则无需考虑这一限制. 如在数轴上移动, 边权为两点距离, 则若两个相同颜色点中间夹了别的颜色的点则依旧可以连边, 故只需考虑颜色连续段内不能互达的限制.
## T2(b) [倒推] [刻画合法条件]
应得:17 实得:17 难度:3 用时:0.5h
对于将多个数合并成一个数的操作, 正向考虑会有组合数种可能的情况, 但反向考虑只有线性种情况, 故应当反向考虑.
对于一类对序列反复进行神秘操作, 并对可能的局面进行计数的题目, 考虑刻画最终局面合法的条件, 或设计一个简单的算法来判断是否合法, 然后对着这个东西 Dp. 但大概率会遗漏或误算, 需要此后手动修正. 如 [联合省选 2025 Day2 T3](https://www.luogu.com.cn/problem/P11835).
## T3(c) [观察力] [关键元]
应得:28 实得:28 难度:3.5 用时:0.5h
对于一类矩阵上连通性的问题, 能观察出的性质大概率是 一个点能到达的位置/能到达一个点的位置 是一个矩形.
随后可以称可能由这种方式生成的矩阵为关键矩阵, 并尝试刻画关键矩阵的条件, 由其中的某些条件说明关键矩阵是不多的, 就可以考虑如何找到这些矩阵. 或者可以将这个技巧理解为, 用格子找矩形那么矩形的情况有 $O(n^4)$ 种, 但找到矩形后用矩形配对格子情况就只有 $O(n^2)$ 种.
在矩阵中选取若干个子矩阵, 彼此只能相离或包含, 则最多选取 $2nm-1$ 个子矩阵. 区间可以自然规约. 证明考虑先把大小为 1 的选了, 然后每次选都会合并两个元素.
## 结算
在发现线段树优化建图被卡常后没有想优化算法, 而是考虑卡边数, 浪费了 1h.
实现 T1 的过程中, 错误地未将排序后的数组还原就直接输出, 发现 WA 了之后还以为是结论错了, 多写了很多数据结构和扫描线.
# 20250415 总结
## T1(a) [贪心]
应得:100 实得:100 难度:3 用时:3.5h
对于一类自适应且需要恰为最优解的交互题, 除了 Dp 最优策略外还可以考虑答案为 $x$ 的充要条件, 然后二分求出答案, 贪心找方案.
## T2(b) [根号分治] [容斥]
应得:40 实得:0 难度:3.5 用时:1.5h
正解被卡常了, 且复杂度多了一个根号, 且没写完也没调.
计数 Dp 优化转移复杂度的一种方式是, 考虑状态对于限制是否无法一一对应, 若存在无法对应的维度则考虑修改意义, 大概率能优化转移. 如若只限制了每个阶段都要改变 $i$ 或 $j$, 且对于 $j$ 来说每个阶段的贡献都一致, 那么并不需要记录 $j$ 的实际值, 而只需要记录有多少个阶段一定要改变 $j$, 最后乘以预处理的容斥系数即可. 这样将 $j$ 的线性转移变为了常数转移.
同 20240926 T3 mex.
注意到 ``>> 32`` 的 UB 在这次写代码的时候又忘记判了.
使用指针动态分配大小为 $n$ 即范围为 $[0, n)$ 的数组的语法为 ``int *p = new int[kMaxN];``, 需要在离开定义域的时候执行 ``delete p;``.
## T3(c) [不会]
应得:20 实得:0 难度:5 用时:0h
没时间写了.
## 结算
因为 T2 是原题, 所以没想写部分分, 最后 1h 想起做法直接冲正解了.
在尝试 Dp T1 的最优操作次数上浪费了 1h, 本来能够写完调完 T2, 再写 T3 的暴力的.
# 20250418 总结
## T1([a](https://qoj.ac/problem/6673)) [容斥] [多项式]
应得:19 实得:0 难度:4 用时:0.5h
难度完全集中在实现的毫无意义的题.
对于一类数不包含任何关键点的图形的问题, 因为一定包含某些点是好做的, 考虑容斥.
对于一类数正方形的问题, 考虑方案数关于边长的函数, 若能将其表示为多项式的形式则可以求前缀和.
## T2(b) [找规律] [矩阵快速幂]
应得:28 实得:0 难度:? 用时:0.5h
毫无意义的打表题, 所有结论在讲解时均未给出证明, 故略.
## T3([c](https://qoj.ac/problem/3040)) [模拟费用流] [观察力] [Dp] [并查集]
应得:50 实得:15 难度:4 用时:4h
01 串转格路的技巧, 如 20250401 T3.
对于一类模拟求最大权匹配的费用流的问题, 可以使用 Dp 而不用维护源点与汇点到某些点的最短路之类的东西. 比如一类序列匹配问题, 若最优的匹配方案每条匹配边代表的区间一定不会互相包含, 且区间内不会有未匹配的点, 则钦定一个区间后在区间内部形成完美匹配的方案是唯一的 (一一对应地按顺序匹配), 则可以以序列为拓扑序转移, 每次选择完美匹配一段区间或者跳过当前点.
对于一类判定两个单调序列各自的一个长度相等的子段是否对应小于的问题, 考虑枚举两个序列下标的偏移量, 对于一个位置必然会是一个前缀小于对应位置而一个后缀不小于对应位置, 故用并查集维护即可做到线性.
## 结算
T3 缺乏了一个区间内不会有未匹配的点的观察, 故没有往 Dp 想. 开了一场的 T3 导致别的题都没做, 不过确实也没有做的意义.
# 20250422 总结
## T1([a](https://www.luogu.com.cn/problem/P3543)) [差分] [闵可夫斯基和]
应得:68 实得:90 难度:3.5 用时:3h
乱搞多骗了一点分.
对于一类区间加减的操作, 理应先做一步差分, 从而变为单点加. 细节上可以考虑加入值为 0 的第 $n+1$ 个数, 这样即使是后缀加也对应了两个位置的修改.
对于一类 min + 卷积, 考虑每个函数是否具有凸性, 即使不能用简洁的式子表示出来.
## T2([b](https://vjudge.net/problem/EOlymp-10444)) [构造]
应得:15 实得:15 难度:4 用时:0.5h
最少颜色数使得有边的两点颜色不同 = 最大团大小.
网格图上的曼哈顿距离不超过 $d$ 的最大团就是旋转 45 度后边长为 $\frac{d}{\sqrt 2}$ 的正方形能框住的最多格点.
## T3([c](https://codeforces.com/gym/102586/problem/A)) [观察力] [势能分析]
应得:55 实得:55 难度:4 用时:1.5h
对于一类每次往 $S$ 加入一个数, 再删去最大值或最小值, 维护 $S$ 做完 $m$ 次操作后的形态的问题, 可以支持 $O(m)$ 地往 $S$ 中插入一个元素. 具体的, 只需维护每个操作删去的数即可, 每次加入元素就从头到尾扫一遍.
对于一类维护进行 $m$ 次操作后的结果的问题, 若不关心中间的结果, 则可以考虑调换某些操作之间的顺序使得结果不变, 即使中间的结果可能改变, 从而只关心每组操作的集合, 以降低一组操作的修改量. 比如对于 $m$ 次操作, 将当前变量 $x$ 与 $a_j$ 比较, 若 $x < a_j$ 则交换 $x$ 和 $a_j$, 则可以将 $a_j$ 合并为一个集合, 每次加入 $x$ 并弹出集合内最大值.
## 结算
T1 第一步的差分就没想到, 但居然会了一个与正解毫无关系的 $O(n^2)$ 做法. 但在设计 Dp 状态时没有想清楚下标范围, 导致使用了 ``unordered_map``, 乱搞跑不过去, 最终重构了代码才跑过去.
# 20250424 总结
## T1(a) [DDp] [决策单调性]
应得:50 实得:50 难度:4 用时:2h
对于一类能够写出 答案的贡献简单但限制条件较多的式子 的计数问题, 考虑将式子用 Dp 实现而不是直接维护式子. 在需要动态维护答案时尤其有用. 同 20250401 T2.
将 $f$ 与 $g$ 做 $\min+$ 卷积得到 $h$, 若 $g$ 为一个下凸函数, 则随着 $h_i$ 下标增加, 最优的 $f_j$ 单调不降, 也即具有决策单调性. 证明考虑构造矩阵 $A_{i, j} = f_j + g_{i-j}$, 然后将 $f_j$ 删去, 显然有 $g_{i-j}$ 为 monge 矩阵.
## T2(b & [sol](https://www.luogu.com.cn/paste/095fn8yu)) [构造] [分类讨论]
应得:20 实得:20 难度:5 用时:2h
不会且毫无意义.
## T3([c](https://qoj.ac/problem/6344)) [线性代数]
应得:10 实得:10 难度:5 用时:1h
不会.
## 结算
纯坐牢.
# 20250429 总结 & [account](https://www.luogu.com.cn/paste/znpos813)
## T1([persona](https://www.luogu.com.cn/problem/P8253)) [min-max 容斥] [拆分贡献]
期望:100 实际:100 难度:2 用时:1h
当贡献形式为 $\max + \min$ 时, 考虑使用 min-max 容斥消去全局的 $\min$, 从而使偏序数量降维.
当贡献中出现了形如 $\min$ 套多个元素的和的形式时, 考虑先分类讨论 $\min$ 的取值, 然后将贡献分摊到每个元素上.
## T2(maze) [网络流] [退流]
期望:68 实际:70 难度:3.5 用时:3.5h
幽默 subtask, 内部分数算加和. 本来可以多拼一点分, 但是没算清自己的复杂度就放弃了.
对于一类在残量网络上增删 $O(1)$ 流量的边, 动态维护最大流的问题, 可以直接每次 $O(m)$ 暴力增广, 并使用 ``bitset`` 优化至单次 $O(\frac{n^2}{\omega})$.
网络流可以退流. 具体来说, 走一条 T 到 S 的路径即可, 随后将路径反向. 故网络流不需要线段树分治.
由于网络流的反悔机制, 使得无需考虑后效性问题, 在网络流上套一些奇怪东西之后依旧每一步都取最优即可. 比如本题建模为 S 向 DAG 上每个点连边权为 $a_i$ 的边, DAG 边权为 1, 每个点向 T 连边权为 mid 的边, 动态维护 mid 为保证 S 能往外流满的最小 mid, 则增加边容易维护, 删边即退流时找 T 到 $i$ 的边权最小的点作为路径上第二个点即可保证局部最优.
## T3(flyburg) [Dp of Dp]
期望:8 实际:0 难度:5 用时:0.5h
幽默 spj, 传统比较模式.
毫无意义的把暴力指数 Dp 变成自动机然后发现结点和边都很少然后再多卡卡常多特判就过了的题.
## 结算
T2 想了 1h 的枚举最小割然后转化为式子并用 Dp 维护, 发现最小割的式子是最大权闭合子图, 然后还在接着想怎么做, 浪费了较多时间.
# 20250430 总结
## T1(ea) [上指标求和] [生成函数] [点值表达式]
期望:40 实际:40 难度:2.5 用时:4h
对于一类无法化简的组合数求和的式子, 考虑求出其递推式. 可以通过分解为上指标求和再得到带求和符号的递推式, 然后使用经典技巧变为 $O(1)$ 的递推式.
对于一类有 $O(1)$ 的生成函数递推式且需要求第 $n$ 项生成函数的问题, 若第 $n$ 项生成函数的次数为 $O(n)$, 则可以直接代入 $2^k$ 个单位根点值, 然后使用矩阵乘法快速幂求出第 $n$ 项的点值, 然后 INTT 得到原生成函数.
NTT 的效率并不低, 长度为 $10^6$ 的数组做一次变换在 O2 下只需要 300ms.
## T2(twelve) [SAM]
期望:100 实际:100 难度:1.5 用时:1h
略.
## T3(move) [观察力] [贪心]
期望:0 实际:0 难度:4 用时:0h
对于一类环上问题, 可以从链开始想起.
对于一类完全不可 Dp 的最优化问题, 考虑限制它的一个下界, 然后判断下界能否取到.
## 结算
认为 $10^6$ 做 NTT 跑不进 1s, 故一心想着推生成函数的通项公式, 浪费了 2h.
发现 T3 又没配 spj, 故完全没想.
# 20250505 总结
## T1(game) [观察力]
期望:100 实际:100 难度:3 用时:3.5h
对于一类博弈论题目, 若双方的目标分别为最大和最小化某个函数, 可以先考虑如何判断答案是否 $\le x$ 或 $\ge x$, 如函数为先手选取的数的 $\min$ 或 $\max$ 时可以变为 01 串, $\text{mex}$ 则可以变为 $\le x$ 的能否全部取到.
寻找双方的最优策略的时候可以考虑是否其中一方有无论另一方如何操作都不劣的策略 (如不断选取出现次数最多的数), 从而可以容易的推出另一方的策略 (如同样不断选取出现次数最多的数以抢走对方的最优决策).
当需要快速判断的条件极其复杂 (比如一个算法的过程中是否会出现某些特殊情况) 时, 考虑枚举出现特殊情况的时刻, 然后将条件转变为若干个不等式, 有时在最优化不等式意义下选取的时刻可以唯一确定.
## T2(pal) [观察力]
期望:75 实际:67 难度:3 用时:1h
忘记判串全是 0 的情况了.
对于一类若干个团的补图的匹配问题, 有经典结论若最大团大小不超过一半则有完美匹配, 否则一定是最大团与其他的尽可能的匹配. 比如有若干连续段, 每次可以删去相邻连续段各自的一个元素, 则最后剩下的元素数量可以使用这个结论计算.
## T3(flower) [询问分块] [平衡树] [势能分析]
期望:15 实际:15 难度:4 用时:0.5h
静态查询区间颜色数可以预处理数对 $(pre_i, i)$, 然后做二维数点. 考场上居然忘记了.
对于一类不带修容易做的数据结构题, 若修改 在某个维度上 是单点 (比如区间把颜色 $x$ 变为颜色 $y$ 在颜色一维上是单点修改), 则可以考虑询问分块, 并分本块涉及到的和没涉及到的.
使用 $O(n)$ 棵平衡树维护一个 $[1, n]$ 的划分, 每次将一棵平衡树的某个区间 Split 再 Merge 到另一棵平衡树上, 这样的复杂度是 $O((n+q) \log^2 n)$ 的. 实现上, 可以类似归并排序的每次 Split 出第一段再 Merge 到答案平衡树上.
考虑定义一棵平衡树的势能为维护的集合 $S$ 中相邻两数的差的 $\log$, 全局势能为所有平衡树的势能之和, 那么最劣情况显然是恰好互相穿插. 设答案平衡树上元素个数为 $m+1$, 相邻两个元素的差为 $d_i$, 势能的减小量为 $\sum_{i=1}^{m-1} \log(d_i + d_{i+1}) - \sum_{i=1}^m \log d_i$. 由于 $\log$ 是凸的, 有上式不小于 $m-1 + \sum_{i=1}^{m-1} {\log d_i + \log d_{i+1} \over 2} - \sum_{i=1}^m \log d_i$, 即 $m-1 - \log d_1 - \log d_m$, $O(m - \log n)$. 故每次花费 $O(m \log n)$ 的时间可以使势能减少 $m$, 而每次操作至多使势能增加 $O(\log n)$. 故复杂度为 $O((n+q) \log^2 n)$.
## 结算
T1 猜了个假结论, 然后对着假结论想优化想了 2h. 以后猜了结论一定要写暴力验证, 尤其是暴力不难写的情况. 不过正确结论的暴力挺难写的.
# 20250506 总结
## T1(silksong) [构造] [模拟]
期望:0 实际:0 难度:5 用时:0.5h
构造很精妙, 但我不希望在模拟赛看到它.
## T2(number) [数论] [自然数等幂和]
期望:100 实际:46 难度:1.5 用时:1.5h
主要区分点在于拉格朗日插值. 今天终于学会正版拉格朗日插值了 /ll.
拉格朗日插值求点值并不需要把多项式求出来, 可以直接将 $x=n$ 代入式子, 然后利用前缀积后缀积和阶乘之类的东西做到单次查询线性.
## T3(guilty) [根号分治]
期望:30 实际:30 难度:3 用时:3h
对于一类限制只有每个位置的值不超过 $a_i$ 的 Dp, 由于当考虑完所有值 $\ge w$ 的位置之后所有 $a_i \ge w$ 的 $a_i$ 都本质相同, 故同样可以按照值域从大往小来做 Dp. 配合正常的按位置 Dp 就可以做根号分治了.
对于两种复杂度 $poly(n) \sum_{i=B}^n {1 \over i^2}$ 和 $poly(n) {1 \over B} \sum_{i=B}^n {1 \over i}$, 其差距有一个 $\log n$. 前者使用积分不难化简, 后者多一个调和级数. 故当枚举的界有类似 $ij \le n$ 的限制时, 即使保证了 $i \ge B$ 也一定要使用 $j \le {n \over i}$ 而非 $j \le {n \over B}$.
## 结算
T3 想了 1h 的容斥, 并且还写了一个假做法. 也想到了根号分治, 但分治的是 $a_i$ 而非实际选取的值, 也没有想到有另一种 Dp 方式.
# 20250508 总结
## T1(a) [贪心]
应得:100 实得:100 难度:2 用时:1h
对于一类看起来就很贪心的问题, 考虑确定一个贪心的顺序, 并考虑有后效性的情况, 证明它不会出现在最优解中. 比如本题从后往前贪心, 发现靠前的 $a_i$ 不会在加值之前不超过靠后的 $a_j$, 而在加值之后超过 $a_j$, 故可以直接对每个 $a_i$ 取最优决策.
## T2(b) [观察力]
应得:10 实得:10 难度:3.5 用时:1h
让人摸不着头脑的题. 电波系神作.
可能对于一些感觉无论怎么样都做不了的题, 就大胆胡猜一些结论然后验证罢.
## T3(c) [观察力] [拆分贡献] [扫描线]
应得:46 实得:46 难度:3.5 用时:3h
对于一类统计可以用 $O(1)$ 个变量来表示的元素 (如只会转弯四次的格路), 考虑大力设出这些变量, 并用变量表示出贡献 (对于最优化问题) 和限制. 好处是可以直观地看出哪些部分是换元之后独立的, 从而将贡献拆开以降低有关的变量数量. 如 20240213 T3.
当发现决策具有单调性时, 不妨回头看看是否并没有与两个元素同时相关的贡献, 从而可以简单地求出每个位置对应的决策.
## 结算
很快地观察到了 T3 的所有性质, 但卡在了维护转弯四次的格路上. 一直在考虑暴力地利用分治和决策单调性和各种东西做类似 meet in the middle, 但导致了做法极其复杂, 复杂度带了 3 个 $\log$, 最终没有写.
# 20250513 总结
## T1(a) [刻画状态] [Dp of Dp]
应得:20 实得:0 难度:3 用时:0.5h
暴搜的细节没想清楚, 且想吃午饭了.
做多了观察类的博弈论题, 不记得想 Dp 了.
对于一类猜数游戏 (即一方的目标是得到所有信息, 另一方的目标是不让对方得到所有信息, 同样包括交互题), 可以通过枚举不知道的信息的所有可能性来刻画状态以进行 Dp. 显然胜利条件为状态只剩一个, 而一次询问和返回的答案也是容易刻画的.
比如能猜答案是否 $\ge x$, 但对方有一次撒谎的机会, 则可以枚举 $2^{2n}$ 个状态表示答案是 $i$, 有没有撒谎过, 是否可能. 紧接着发现第二维有单调性, 则状态数降低至 $3^n$ 种, 继续发现可以把不合法的状态删去, 并合并连续段, 发现一定是一段撒谎过 一段没撒谎 又一段撒谎过, 则状态数只有 $O(n^3)$.
交换下标和 Dp 值的技巧较为板, 如 20241017 T3.
## T2(b) [观察力] [SAM]
应得:100 实得:100 难度:3 用时:2.5h
考验胆量的题目, 需要大胆对各种东西都打表然后猜事情. 下简要列一下结论, 证明考虑基本子串结构的周长和.
考虑 SAM 的后缀树, 将所有叶子, 分叉点和原串每个前缀所对应的点涂黑, 然后考虑黑点切出的若干条链, 每条链显然代表了一个原串的子串 (比如考虑将后缀树解压, 然后从一个黑点开始, 不断往上跳父亲直到自己跳到了另一个黑点, 并将每次删去的开头字符放在字符串 $T$ 的结尾, 则 $T$ 就是这条链对应的串, 显然在原串中出现过), 将每个子串对应到在原串中第一次出现的区间, 则以每个位置作为左端点的区间的最大长度的总和为 $O(n)$ 的. 故对于以这种方式给定的若干个区间, 快速对每个区间都求出某个东西 (如本质不同子串个数) 可以考虑从每个位置开始往后扫.
对于一类可以被拆分成两部分的题目, 若第二部分直接将第一部分可能蕴含的性质直接舍去做不了, 则可以考虑开始在第一部分打表找规律. 比如对 $O(n)$ 个区间都求出本质不同子串个数, 最优的复杂度为 $O(n \log^2 n + q \log n)$, 原题的 $10^6$ 范围显然过不了, 故考虑找这些串的规律.
## T3(c) [平衡树]
应得:28 实得:28 难度:4.5 用时:1h
同 20240405 讲题 T11, 一坨数据结构, 故略.
## 结算
基本板子题要对复杂度有印象, 即使不会这个算法. 这样可以排除掉直接用板子做的可能性, 从而不会因为自己不会这个板子而直接跳过.
# 20250520 总结
## T1(a) [关键点对]
应得:100 实得:100 难度:2 用时:**2.5h**
称字符串的一个区间 $[l, r]$ 是好的当且仅当 $s_{l-1}$ 和 $s_{r+1}$ 在区间内未出现, 或者是边界, 那么所有好的区间的数量是 $O(n|\Sigma|)$ 的, 长度总和是 $O(n|\Sigma|^2)$ 的. 证明考虑只有左端点到某个字符的下一个出现位置的区间才可能合法, 且一个字符只会对左右各 $O(|\Sigma|)$ 个端点产生贡献.
## T2([b](https://codeforces.com/problemset/problem/1250/K)) [网络流]
应得:100 实得:0 难度:2.5 用时:1h
要输出方案, 且以为需要上下界网络流, 于是认为极其难写便没写. 事实上 1.5h 就写完了.
将若干区间划分为 $n$ 组, 使得组内区间两两不交, 则 $n$ 的最小值为同时包含了一个相同区间的区间数的最大值. 使用 Dilworth 定理易证, 构造方案直接将所有区间按左端点升序排序, 然后任意地放在一个合法的组内即可.
对于一类在区间集合中选取若干个区间, 使得每个位置被覆盖的次数在一个范围 $[a_i, b_i]$ 中的问题, 可以使用志愿者招募模型, 即选取一个大数 $M$, 然后连一条链, 容量上下界为 $[M-b_i, M-a_i]$, 对于每个区间从左端点向右端点连容量为 1 的边, 跑一个流量为 $M$ 的可行流即可.
对于一类上下界网络流, 考虑将模型的形态画出来, 然后或许能观察出下界恰好构成合法的一组流, 则可以直接将下界消去, 上界减去下界. 若还是消不去, 还能考虑在建模时能否将一些东西对称掉, 使得边权发生改变. 比如从决策拿走哪些变为决策保留哪些.
## T3(c) [模拟费用流] [观察力]
应得:30 实得:30 难度:3.5 用时:1h
对于一类选若干条连通的链, 最大化交集的边权和的问题, 钦定一个一定要出现的叶子之后, 费用流建模是显然的, 也容易发现就是长链剖分取前若干大. 但注意到直径两端点之一一定会出现, 故枚举量变为了 2. 进一步说, 对于一类和最大化链长有关的问题, 若暴力做法需要枚举根, 则考虑能否将根定为直径两端点之一, 并尝试证明正确性.
对于上述问题, 若还对 $O(1)$ 条链作出了限制 (比如一定有一条链要经过一个点), 则考虑费用流的退流操作, 并做对应的调整. 比如分类讨论退的那个流量是否把所有贡献都退掉了, 全退掉可以用少选一条链再选上这个点向下的最长链加上向上的部分的贡献更新, 没全退掉可以往上找到的第一个被选的链, 把它的叶子改到这个点向下的最长链去. 更进一步说, 少选一条链再选上最长的调整方法是容易想到的, 那么不妨考虑它在费用流模型中的什么情况下是优的, 从而自然的进行了分类讨论.
## 结算
想 T1 的时候比较昏昏欲睡, 于是耗时比较久.
为啥感觉所有和直径有关的结论都注意不到. 前情提要: 20240926 T1.
# 20250522 总结
## T1([a](https://qoj.ac/problem/10872)) [观察力]
应得:100 实得:100 难度:3 用时:3.5h
当题目中给定了一些神秘操作的时候, 可以考虑是否可以将元素分组使得不同组间操作独立. 比如本题可以将矩阵划分为若干个右上左下的楼梯, 从而变成一维问题.
对于一类非对称博弈, 目标是让对方无法操作的博弈游戏, 考虑计算一个局面不管操作顺序双方各能操作多少次, 多个局面的并就是将次数相加. 具体原理和超现实数有关, 但一般可以猜测是对的.
博弈论题猜完结论最好写指数暴力对拍. 本题拍挂了两次.
## T2([b](https://qoj.ac/problem/11302)) [观察力]
应得:10 实得:10 难度:3.5 用时:1h
经典结论: 给定 $n$ 个 $[1, n + 1)$ 的子区间 $[a_i, b_i)$, $n$ 排列 $p_i$ 满足 $p_i \in [a_i, b_i)$ 的数量模 2 即边集 $(a_i, b_i)$ 能否构成一棵树.
给定 $n$ 行 $n$ 列矩阵 $A_{i, j}$ 满足 $A_i$ 单调不降, 若需要选择一个 $n$ 排列 $p_j$ 满足 $A_{p_j, j}$ 单调不增, 则每个 $j$ 对应的 $A_{*, j}$ 的值是固定的. 具体的, 第一列选择的行对应的值一定是字典序最大的行对应的值, 随后把第一列和字典序最大的行删去后变成子问题.
## T3([c](https://qoj.ac/problem/10865)) [观察力] [兔队线段树]
应得:35 实得:35 难度:4 用时:0.5h
对于一类数据结构题, 若发现暴力完全无法维护, 则应当考虑优化暴力. 至少应当将预处理的复杂度降低到可以接受的范围. 比如本题需要知道一个后缀的前缀最大值中比 $x$ 大的数的数量, 事实上由于 $x$ 具有特殊性质, 这个值可以放在后面第一个比 $x$ 大的前缀最大值的位置计算, 从而无需记录所有的前缀最大值.
若一类最优化问题, 每次有多种决策, 但只考虑一种决策能得到至多比最优解大 $O(1)$ 的答案, 则可以先只考虑一种决策, 然后再考虑往更小的答案 check.
## 结算
对于经典结论不熟悉, 虽然之前见过但做题的时候没有意识到.
# 20250527 总结
## T1([a](https://qoj.ac/problem/10871)) [观察力]
应得:100 实得:100 难度:2.5 用时:2h
对于一类有将序列循环位移的操作, 若事实上并不关心每个元素的绝对下标而只关心元素间的相对下标, 则可以在循环位移上做手脚, 让元素不移动或移动量较少.
## T2(b) [构造]
应得:42 实得:42 难度:3.5 用时:1.5h
对于一类构造题, 若前面的特殊性质是容易做的, 则可以考虑将没有特殊性质的情况归约至有特殊性质的情况. 比如本题所有树的根都相同时容易做, 则对于树的根只有 1 和 $n$ 的情况, 只需选择一些边来将 1 和 $n$ 合并成一个连通块即可.
## T3(c) [多项式] [线性代数] [组合意义] [树链剖分]
应得:12 实得:12 难度:5 用时:0.5h
[一类特殊格路计数问题](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
有 $A^{-1} = {\text{adj}(A) \over \det(A)}$. 其中 $\text{adj}(A)_{i, j} = (-1)^{i+j} M_{j, i}$, 其中 $M_{i, j}$ 为 $A$ 去掉第 $i$ 行第 $j$ 列的行列式.
快速求解特殊矩阵的行列式可以考虑矩阵中一个 环 可能的形态. 则行列式中枚举的排列一定是若干个环的并. 比如求无向树上随机游走的邻接矩阵的行列式, 则环只可能是对于一条边 $(x, y)$ 来说从 $x$ 到 $y$ 再回到 $x$, 显然排列的逆序对数就是选取的边数, 则求行列式变为了求完美匹配方案数.
## 结算
T2 两个特殊性质使用的做法完全无交, 导致做出了特殊性质也对正解没有帮助. 事实上有很多人使用 ``shuffle`` 草过了 T2.
# 20250529 总结
## T1([a](https://qoj.ac/problem/10798)) [观察力] [决策单调性] [分治]
应得:26 实得:0 难度:3.5 用时:2h
对于共同形成一个凸包的点集 $S$ 和 $T$, 求 $S$ 内每个点在 $T$ 内的最远点, 满足决策单调性. 证明考虑四边形不等式.
Borovka 的过程中, 需要对每个点求出去除掉一个集合后的最优点. 假设我们已经会一个弱化的问题, 即给定两个元素集合 $S$ 和 $T$, 可以 $\tilde{O}(|S|+|T|)$ (即忽略掉 $\log$ 后是 $O(|S|+|T|)$) 的求出 $S$ 内每个点在 $T$ 内决策的最优点, 则考虑分治目前的所有等价类, 每次对左边求右边的最优决策, 再对右边求左边的最优决策即可. 只需一个 $\log$ 的代价即可将弱化的问题拓展.
## T2([b](https://qoj.ac/problem/10781)) [连续段 Dp] [分类讨论]
应得:100 实得:9 难度:3 用时:2h
大分讨没写完. 差了大约 1h.
对于一类排列相关的 Dp, 若贡献或者限制与值域连续段 (即析合树维护的东西) 有关, 考虑使用连续段 Dp. 特别的, 对于一类值域连续段长度不超过某个值的限制, 不应使用容斥, 而仍然应当使用连续段 Dp.
计数 Dp 中通过在真正需要知道某个元素的相对顺序时再赋相对顺序的方式, 可以减少分类讨论的种类数. 比如, 连续段 Dp 中可以先不钦定每个连续段的相对顺序, 这样就没有了最边上的连续段与其他连续段的区别, 可以在转移时再根据具体情况来钦定.
## T3([c](https://qoj.ac/problem/6816)) [AC 自动机] [观察力]
应得:50 实得:0 难度:4 用时:1h
对于一类字符串计数题, 可以通过观察大样例的输出来确定答案的规模. 若答案规模较小, 则可以考虑是否可以通过某些方式来快速排除掉一定不合法的情况. 比如本题确定 $s_k$ 后只需考虑 $s_i$ 是匹配路径上每个点在 fail 树上的祖先中的最近字符串结尾和和次近字符串结尾.
## 结算
开局开了 2h 计算几何, 心态大爆炸. 随后想 T2 的容斥想了 1h+. 应当及时收手的.
# 20250603 总结
## T1(a) [插头 Dp] [简化状态]
应得:100 实得:66 难度:3 用时:2h
想到了将两种操作结合在一起的变形方法, 但因为早上脑子不清楚, 认为是 $6^n$ 的而不是 $3^n$.
对于一类经典的异或方格全变 0 问题, 若一个操作只会影响上行本行和下行, 则要记录的只有上一行的 bitmask 和对下一行的影响, 故两部分不独立时可以考虑合并在一起以简化状态. 如若一种操作是异或一个格子, 一种操作是异或四联通的四个格子, 并把自己变成通配符, 则记上一行的 bitmask 的同时对下一行的影响也唯一确定了.
## T2(b) [主席树] [整体二分]
应得:100 实得:100 难度:2.5 用时:1.5h
对于一类与区间 $\text{mex}$ 有关的题目, 除经典的莫队外还可以以右端点为编号, 值域为下标做主席树, 每个下标存上一个当前值出现的位置; 或以值域为编号, 右端点为下标做主席树, 每个下标存最短的左端点使得区间 $\text{mex}$ 大于当前值. 前者可以 $O(\log n)$ 查静态区间 $\text{mex}$, 后者可以支持一系列对 $\text{mex}$ 进行二分的操作.
整体二分只需要支持快速的使 $mid \plusmn 1$ 和查询一个区间答案与 $mid$ 的关系即可, 故即使正常做需要大数据结构, 也只需套一个撤销即可. 实现上, 若维护修改需要同时做一些查询, 可以将修改事实上做的事情预处理出来, 这样整体二分的时候就不用做这些查询.
主席树若需要打标记, 查询时不能下传标记, 否则结点数会大幅增加, 尤其是查询次数量级超过修改次数量级时. 不过我这次明智地提前注意到了.
## T3([c](https://qoj.ac/problem/10042)) [倒推] [贪心] [线段树]
应得:19 实得:7 难度:4.5 用时:1h
甚至没有想到 $O(n!)$ 枚举顺序然后从左到右地匹配的暴力. 有点唐.
对于一类整体看上去完全做不了的题目, 考虑假设知道了某些信息后原题是否变成了简单题, 则只需考虑如何求出这些信息. 比如本题知道了任意一组集合使得集合内元素两两不相邻, 且给定的区间对集合内元素存在完美匹配, 则简单贪心即可求出答案, 故只需考虑如何求出集合即可. 事实上感觉其常见于为每个元素分配匹配元素的题目里面, 通常是简化成确定用到的元素集合.
## 结算
T1 写完 $O(4^nn^2)$ 后发现比时限多了 $\epsilon$ s, 故认为是被卡常了而没有想去优化. 事实上在开考看题的时候就想到了优化方式. 有点唐.
T2 曾考虑过不写主席树而写整体二分, 但忘记了该如何整体二分. 虽然主席树远好写于整体二分. 有点唐.
# 20250605 总结
## T1([a](http://qoj.ac/problem/10083)) [观察力]
应得:100 实得:100 难度:3 用时:2h
对于一类 01 矩阵中每一行的 01 变量的值都至多只能变化一次 (一个前缀是 0, 剩下是 1 或者一个前缀是 1, 剩下是 0) 的条件, 相当于相邻列的异或的 popcount 之和等于第一列和最后一列的异或的 popcount. 比如, $n$ 个 $m$ 排列使得任意两个数 $a$ 和 $b$ 在排列中的相对顺序关系至多只能变化一次, 相当于相邻两排列的逆序对之和等于第一个排列和最后一个排列的逆序对.
## T2(b) [鞅函数]
应得:13 实得:13 难度:4 用时:1.5h
对于一类鞅函数题, 理应认为一个局面的势能是每个元素的势能之和, 那么可以推论元素的变化是独立的. 比如随机选择一条边删去, 则可以只关心每个点的度数和总边数. $d_i$ 有 ${d_i \over m}$ 的概率减 1, 剩下的概率不变, 可以直接根据这个建立鞅函数. 事实上只是对暴力推鞅函数式子的一个跳步骤.
## T3(c) [万能欧几里得] [不会]
应得:10 实得:10 难度:5 用时:1h
不会.
## 结算
纯坐牢场. 唯一的不足在于没有想清楚鞅函数可以钦定每个元素独立, 就没有推鞅函数.
# 20250610 总结
## T1([a](https://www.luogu.com.cn/problem/AT_apc001_g)) [观察力] [构造] [归约]
应得:34 实得:24 难度:3.5 用时:2.5h
不想写预处理+暴搜.
对于一类构造题, 应当考虑一个较小的结构, 使得这样的结构重复多遍即可解决特殊性质, 而不是对于特殊性质整体构造. 这样能够有更强的拓展性. 比如, 本题全是 1 的部分分中, ``12123434...`` 要好于 ``1234...1234...``.
对于一类需要构造状态很庞大的东西的题目, 可以考虑利用已有的较小结构来把问题归约到较小的规模. 比如本题连续四个两侧都是 1 边的端点 ``wxyz`` 可以将 ``wy`` 和 ``xz`` 连边, 然后即可把这一段缩成一条 1 边.
## T2([b](https://www.luogu.com.cn/problem/P7124)) [重链剖分] [哈夫曼树] [分治]
应得:74 实得:74 难度:3 用时:2h
对于一类带权分治的问题 (比如重链剖分后分治每个轻子树, 显然每个子树的大小不同), 考虑使用哈夫曼树分治而非每次取 mid, 或许能让复杂度少一个 $\log$. 考虑哈夫曼树的复杂度, 若每次递归需要的花费是本次涉及到的所有元素的权值和, 设全局所有元素的权值和是 $s$, 一个元素的权值是 $a_i$, 则一个元素对复杂度的贡献是 $O(a_i \log {s \over a_i})$ 的. 考虑哈夫曼树建立的过程中, 小根堆顶是 $a_i$ 的时候, 堆内至多只有 $s \over a_i$ 个元素, 故在哈夫曼树上的深度是 $O(\log {s \over a_i})$ 的. 故所有元素的贡献和是 $O(s \log s - \sum a_i \log a_i)$ 的. 故若之后又会将每个元素拆开继续独立求解, 复杂度依旧是 $O(s \log s)$ 的.
树上对于每个点得到全集去除这个点的子树, 可以考虑上文的重链剖分, 但也可以考虑对 dfn 分治. 显然包含 mid 的区间有偏序关系, 故左右同时往中间扫即可. 虽然也是 $O(n \log n)$, 但比上文的方法常数大.
## T3(c) [分类讨论] [容斥]
应得:8 实得:1 难度:4.5 用时:0.5h
唐了, 认为自己推出的二维式子不对, 也没时间去验证.
对于一类解的形态可能比较复杂的问题, 考虑通过分类讨论来去掉一些简单情况, 并考虑剩下的情况是否有了一些额外性质, 从而对解的形态有了较好的约束. 一般来说剩下的情况的额外性质并不显然, 需要一定的胆量. 比如本题所有维度均不平整的情况, 除了 $z$ 轴上某些恰等于一个特殊相位的列外都是规则排列的.
## 结算
T2 与正解的差距只有一个哈夫曼树, 并且在最后意识到了暴力分治比较劣, 但没有时间继续改进了.
# 20250617 总结
## T1(a) [线段树二分]
应得:100 实得:77 难度:2 用时:**3h**
为什么先二分再线段树查询? 为什么先二分再线段树查询? 为什么先二分再线段树查询? 为什么先二分再线段树查询? 为什么先二分再线段树查询? 为什么被卡常了不去优化算法? 为什么被卡常了不去优化算法? 为什么被卡常了不去优化算法? 为什么被卡常了不去优化算法? 为什么被卡常了不去优化算法?
当主席树维护的都是可减的信息时, 区间查询可以同时对左右端点对应的树查询, 从而可以当作只有一棵普通线段树.
## T2(b) [观察力] [刻画操作]
应得:12 实得:12 难度:3.5 用时:1h
对于一类同时与序列和树有关的问题, 应当以序列为主体思考, 因为序列显然是一类特殊的树.
对于一类计数能到达多少个不同的局面的问题, 应当去寻找一个简洁的方式刻画总体上能进行的操作. 比如本题可以变成一路换去左边的段与一路换去右边的段交替, HNOI2025 Day2 T3 可以变成在无穷长的序列上选取一个满足某些条件的子序列.
## T3(c) [构造]
应得:15 实得:15 难度:4 用时:0.5h
思想是简单的, 难点在于毫无意义的卡常和调参数.
## 结算
想并写完 T1 $O(n \log n + q \log^2 n)$ 做法只花了 1h, 无效卡常花了 2h.
# 20250619 总结
## T1([a](https://atcoder.jp/contests/agc011/tasks/agc011_f)) [倒推] [观察力]
应得:43 实得:10 难度:2.5 用时:1.5h
谁家好心出题人不保证 $a_i < mod$ 啊?????
对于一类按时间顺序同时正序和逆序遍历序列的事情, 考虑正序扫序列, 维护一个时间正流的元素和一个时间倒流的元素.
对于一类 Dp 中形如循环位移的转移, 若位移的偏移量是定值, 考虑将 Dp 的状态提前做循环位移, 就可以省去维护循环位移的部分, 同时让 Dp 方程更加简洁.
## T2([b](https://qoj.ac/problem/12121)) [构造] [辗转相除] [随机游走]
应得:40 实得:40 难度:4 用时:**2.5h**
对于一类使用极少元素构造出一个大数的问题, 考虑记当前局面中两个或更多 (比如三个) 元素的附带属性, 使得在增量构造的过程中两个元素的变化形如一个辗转相除的逆过程, 从而可以对需要构造的大数做辗转相除, 再倒序增量构造. 比如本题可以记到图中两个没有出度的点的概率比为 $(a, b)$, 则将 $a$ 连向 $b$ 和新点会使二元组变为 $(a, a+2b)$, 将 $a$ 连向新点和源点会使二元组变为 $(a, 2b)$, 则逆操作时每次都能让其中一个数减半. 事实上这个思想是常见的, 如 20250618 讲题 Dense Planting.
对于一类有向图上随机游走问题, 若将指向源点的出边去掉后原图变为 DAG, 则走到每个无出度的点的概率是好算且直观的, 直接从源点开始 Dp (或理解为计算路径条数带权和) 即可, 故在增量维护图的时候只需维护还有可能继续加出边的点的概率即可.
## T3([c](https://qoj.ac/problem/122)) [观察力] [分类讨论] [meet in the middle]
应得:30 实得:30 难度:3 用时:1h
都是比较套路的 Dp 方法. 难点主要在于一步步思考的耗时和代码实现的小细节.
## 结算
经典早上神志不清于是跳过了 T1, 随后在最不可做的一道题上浪费了最久的时间, 导致 T1 没有时间思考. 并且对自己能拿到的分数的预估出现了问题, 导致 T2 的最后 1h 分数的变化量为 0.
在拿完 T3 的 $O(n)$ check 暴力分后及时回去写 T1, 虽然没拿到分但策略是正确的. T3 更多的分是难以拿到的.
# 20250624 总结
## T1(a) [观察力] [计数 Dp]
应得:100 实得:100 难度:2 用时:1.5h
将能够直接写出式子的计数问题利用 Dp 解决. 同 20240424 T1.
## T2(b) [分类讨论] [扫描线]
应得:100 实得:100 难度:2 用时:1.5h
匹配字符串时, 若分为了先一段平凡的再一段特殊的, 需要记得之后还会有一段平凡的. 比如求最长回文串长度, 可以将一个区间做凯撒加密, 则一边加密和一边不加密匹配完之后还能继续匹配两边都不加密.
## T3(c) [贪心] [观察力] [类欧几里得]
应得:41 实得:32 难度:4 用时:2h
能用栈做的东西硬用 ``priority_queue`` 来上 $\log$.
对于一类 $n$ 个点带权 $w_i \ge 0$ 的树, 按某种顺序选点, 若第 $i$ 次选了第 $p_i$ 个点则有 $i \times w_{p_i}$ 的代价, 需要最小化代价, 但一个点只能在父亲选了之后选 的经典题目, 若树的形态为除根外所有点都至多只有一个儿子, 则可以对每条链做单调栈, 再将每个栈归并在一起. 若可以证明每条链最终的栈内元素为亚线性级别, 则可以少一个 $\log$.
进一步地, 这个单调栈的过程相当于对 $(i, \sum_{j=1}^i w_j)$ 做上凸壳, 故栈内的元素数量的结论可以套用凸包一类的结论.
取不高于 $y = {a \over b} x \space (a, b > 0)$, $0 \le x \le n$ 以内的所有整点做上凸壳, 则凸壳的边数是 $O(\log n)$ 的 (三点共线则认为中间点不在凸包上). 证明与求凸壳的算法一致, 待补.
[类欧几里得](https://www.luogu.com.cn/article/ft3tx54e) 相关知识点.
## 结算
由于在场上手推类欧且忽略了很多限制条件而挂了很多次, 时间稍紧, T3 的暴力并没有拿满.
# 20250626 总结
## T1([a](https://uoj.ac/problem/497)) [观察力] [区间 Dp]
应得:100 实得:100 难度:2 用时:2.5h
将每个元素变为相邻两个元素的 $\max$ 或 $\gcd$ 的技巧如 P12430. 不过在本题好像没什么用?
对于一类枚举断点转移的区间 Dp, 一种优化的思路是通过手玩样例观察断点是否只有较少的可能性 (比如要么是最左侧要么是最右侧). 最好能够证明.
## T2([b](https://loj.ac/p/523)) [观察力] [分类讨论]
应得:100 实得:0 难度:3 用时:0.5h
下班了, 就没写代码. 但难点主要在于实现.
对于一类匹配问题, 若一边的点度数较少 (如只有 2), 则可以将这一边的点换成更加简洁的结构 (如连接两个另一边的点的边), 使得问题转化为更简单的形式 (如给每条边定向使得每个点入度至多为 1).
给一棵树定向使得每个点入度至多为 1, 可以考虑枚举没有入度的点, 则其它的边是以这个点为根的外向树, 可以用数据结构简单维护每个点为根的答案. 而不应当使用 Dp 求最优的方案.
## T3([c](https://qoj.ac/problem/6197)) [字符串同构] [字典树]
应得:9 实得:0 难度:5 用时:0.5h
下班了, 就没写代码.
对于一类在可以对字符进行置换意义下判定两字符串等价的问题, 考虑将字符串做如下变换: 将每种字符第一次出现的位置写上 0, 否则将这个位置写上这个位置到上一个相同字符的位置之间出现的字符种类数. 则生成的值域在 $[0, |\Sigma|]$ 内的序列相等是两字符串等价的充要条件. 同时, 任何一个 0 的数量 (记作 $c$) 不超过 $|\Sigma|$ 的序列都对应了至少一个字符串, 且对应的字符串的数量为 $|\Sigma|^{\underline c}$.
对于一类计数能由 $s_1, \cdots, s_n$ 的各自一个子串拼接而成的字符串数量的问题, 考虑贪心地尽量在前面的字符串匹配完, 则对每个串建立 SAM 后容易 Dp.
## 结算
由于不可抗力导致真实考试时长只有 <3.5h.
T1 不经思考地写了 $O(n \log^2 V)$ 做法, 但事实上 $O(n \log V)$ 做法在此之后是不难想到的. 而前者写完后经典被卡常, 好在花了 0.5h 的时间拼了一个错误的剪枝就过了.
# 20250702 总结
## T1(a) [观察力] [构造]
应得:15 实得:15 难度:3.5 用时:1.5h
对于一类条件简单的最优化构造题, 可以考虑猜测答案的形式 (比如叶子个数的一半取上整). 具体的, 可以通过若干简单的情况来得到一些可能的猜测 (如考虑菊花图), 考虑证明答案一定不优于这个值, 并给出一种取到的构造.
## T2(b) [网络流] [Dp] [复杂度分析]
应得:85 实得:85 难度:3.5 用时:3.5h
对于一类网络流建模显然的题目, 优化可以考虑 Dp 最小割.
完全二叉树上, 对每个子树记 $O(\text{Poly}(dep))$ 的信息, 则总状态数还是 $O(n)$ 的. 积分再求极限不难发现. 故在完全二叉树上按链 Dp 不如按子树 Dp.
## T3(c) [构造双射] [多项式]
应得:40 实得:0 难度:5 用时:0h
没有时间写暴力了.
存在一张简单二分图使得左部点度数为 $a_i$, 右部点度数为 $b_i$ 的充要条件为对于每个 $1 \le k \le m$ 有 $\sum_{i=1}^n \min(a_i, k) \ge b_i$ 前 $k$ 大之和. 使用网络流建模并枚举最小割的方案不难证明. 发现不等式左边其实是 $a_i$ 的转置的前 $k$ 大, 故可以用来双射一类 $a_i$ 前 $k$ 大不超过 $b_i$ 前 $k$ 大的问题.
更普遍地, 对于一类只与前 $k$ 大有关, 而与序列具体的位置无关的描述, 可以考虑将序列排序并转置.
## 结算
最后 0.5h 还因为想在模拟赛过一道题而继续对 T2 卡常. 事实上用这段时间写 T3 暴力是足够的. rk9->rk22.