训练日志
神秘。
7.13
P4145 上帝造题的七分钟 2 / 花神游历各国
诈骗题,考虑到一个数开根次数不多于 6 次,写个链表维护下一个不为 1 的位置,再套一颗线段树即可。
P5490 【模板】扫描线 & 矩形面积并
神秘线段树题。排序+离散化后就是维护一条线段被计算的长度。我们此时不再关注矩形形状,只关注矩形开始的那条高和结束的那条高线段。
考虑一个聪明的算法维护:对区间维护一个标记,标记只能为大于等于零的数,如果大于零,表示这一段是全覆盖的,那么权值是区间长度,否则,是左子树和右子树区间权值的和,对于每个线段,如果他是开始,那么往它所负责的区间标记加一,否则减去一,就可以很好维护。
Ex.矩形周长并
类似于面积并,横着扫一遍+竖着扫一遍即可,每扫一遍的答案加上这次查询的答案与上次答案差的绝对值即可。
注意两个矩形边贴边的毒瘤情况。
P4513 小白逛公园
单点加的最大子段和。
维护区间和、左侧最大值、右侧最大值和区间最大值即可。注意向上合并时要对这个区间和加旁边区间最大值与这个区间最大值取最大值。
7.14
P13916 [PO Final 2024] 瓦萨滑雪节 / Vasaloppet
神秘题目,整个暑假最坑的题。
场上调了 0x3f 个小时的双指针没出来,最后是写了 1e9 个 bool 才过。谁在赛时敢开 1e9 个 bool,谁敢在赛时写 2e9 次简单运算!
神秘。
P10804 [CEOI 2024] 玩具谜题
神秘搜索题,bfs 维护可达性即可,前缀和优化。
场上有人写 A* 没调出来,是谁呢/ll。
7.15
P5278 算术天才⑨与等差数列
考虑什么条件可以确定序列是一个等差数列。
首先是区间 \(\max-\min=(r-l+1)\cdot k\) 这个是容易的,考虑中间的数仍然无法确定,我们维护差的 \(\gcd\) 即可。又考虑到可能有重复的数,那么就维护前驱 \(\min\) 即可,那么这个数列可以证明是一个公差为 \(k\) 的等差数列。
实际上这道题就是考虑每一个等差数列的性质进而推倒条件后删除多余的条件即可,本质上是一种想一种策略,hack 掉策略、优化策略的过程。
P10066 [CCO 2023] Binaria
神秘,做差后考虑到一个信息中若第 \(i\) 位为 \(1\) 那么 \(i+k\) 位就是 \(0\) 反之亦然。这意味着我们已经确定了一些位置和知道了 \(1\) 的个数。那么我们就知道了未确定位置的个数和确定为 \(1\) 位置的个数。那么结果就是这两个组合一下。
P6374 「StOI-1」树上询问
简单题。考虑在路径上的情况下,LCA 处和不在路径上。注意 LCA 也是在路径上的。
怎么秒了……
P2680 [NOIP 2015 提高组] 运输计划
直接上树剖,秒了。
怎么是树上差分?!警示:没有修改操作时不要上树剖这种东西。
P6312 [PA 2018] Palindrom
4MB 好题!
考虑一个字符一个字符的读入,一个正着做哈希,一个倒着做哈希即可。
P4516 [JSOI2018] 潜入行动
DP 大式子题。DP 式子是一眼的,剩下的就是慢慢码了。
建议带修出动态 DP。
7.16
P10470 前缀统计
简单题,不说了。
P5546 [POI 2000 R3] 公共串
哈希+二分经典套路。
开个 unordered_set 维护即可。
P3121 [USACO15FEB] Censoring G
建个 AC 自动机,在匹配时匹配上了,那么在答案字符串一顿 pop_back 即可,记得指针也要回去,记录路径即可。
P5829 【模板】失配树
神秘。
对 border 建树,两个前缀的最长公共 border 即为他们在 border 树上的 LCA。
会考吗,这么糖的算法。
P3959 [NOIP 2017 提高组] 宝藏
给你一个图,你要找到一颗与节点深度相关的最小生成树。
现有朴素的状态:\(dp_{i,j,S,T}\) 是以 \(i\) 为根,树的深度是 \(j\),已经有点集 \(S\) 第 \(i\) 层的点集是 \(T\) 那么转移就是:
这是 \(O(n^24^n)\) 的算法,不可接受。
考虑到如果两个子集能够连接,那么在更深的地方统计肯定会劣于在相应深度就统计,不会影响答案。
那么就可以扔掉 \(T\) 这一维:
这是 \(O(n^23^n)\) 算法。
一种良好的子集枚举方式是:
sub=s&(s-1);sub;sub=(sub-1)&s
7.17
P6192 【模板】最小斯坦纳树
考虑状态 \(dp_{i,S}\) 为以 \(i\) 为根时,包含关键点集 \(S\) 的最小代价。
转移是:
如果把边转移到一个不是关键点的点上,那么转移可以看做换根:
按 \(S\) 升序转移,先进行第一个式子,再进行第二个式子,用最短路转移就行了。
时间复杂度:\(O(m\log m\cdot 2^k+n\cdot 3^k)\)。
P4294 [WC2008] 游览计划
同 P6192。
P3177 [HAOI2015] 树上染色
状态设计是不难的:\(dp_{i,j}\) 表示在 \(i\) 子树内,染黑 \(j\) 个点的最大贡献。
转移是不难的。
P10957 环路运输
优化 DP。
环上问题先考虑断环,那么变成一个 \(2\times n\) 的序列,可以 DP。接着用优先队列优化 DP 即可。
不难发现,我的优化 DP 水平 <<<<<<<<<<< DP 水平。
P3264 [JLOI2015] 管道连接
最小斯坦纳森林。
先跑最小斯坦纳树,跑出来的数组是 \(f\)。
考虑两两颜色的合并:\(\operatorname{cost}(S)=\min_{i} f_{i,\bigcup_{col\in S}}\)。
那么最后的状态转移式子是:
最后的时间复杂度是 \(O(m\log m\cdot 2^k+n\cdot 3^k)\)。
7.18
P3389 【模板】高斯消元法 & P2455 [SDOI2006] 线性方程组
简单解方程题,略。
7.20
P3232 [HNOI2013 / JSOI2013] 游走
图上随机游走题,每一个点的概率/期望是一个方程组用高斯消元解出来即可。
中间有几道矩阵快速幂题,可糖,跳了。
P3216 [HNOI2011] 数学作业
先考虑朴素的转移:
列转移矩阵:
这玩意咋列出来的?
首先我们要考虑它的递推公式,并把它竖起来:
\[\begin{bmatrix} dp_{i}\\ i \end{bmatrix} \]再之,找它的递推式,\(dp\) 的式子已经有了,\(i\) 仍需要一个 \(1\) 那么我们把 \(1\) 塞到矩阵里:
\[\begin{bmatrix} dp_{i}\\ i\\ 1 \end{bmatrix} \]我们把下一个矩阵横着列,这个矩阵竖着列,把每一列的转移需要什么标上去,矩阵就完成了:
\[\begin{aligned} &\begin{bmatrix} \ dp_{i+1}&\ i+1&1 \end{bmatrix}\\ &\begin{bmatrix} 10^{\lg i+1}&\ 1&\ \ \ 0\\ 0&\ 1&\ \ \ 1\\ 0&\ 0&\ \ \ 1 \end{bmatrix} \begin{bmatrix} dp_{i}\\i\\1 \end{bmatrix} \end{aligned} \]
不难发现,\(10^{\lg i+1}\) 转移是困难的,但是值只会变化 \(\lg\) 次,直接维护就行,最终时间复杂度是 \(O(\log^2 n)\)。
7.21
P1707 刷题比赛
按照上面的方法,列出式子:
fun fact:上面一坨有 1.5k 的字符哦。
P4115 Qtree4 & P2056 [ZJOI2007] 捉迷藏
给你一棵树,动态维护树上两两白点的距离最大值。
考虑没有修改操作:直接两次 DFS 即可。
再考虑一个结论:可以 \(O(1)\) 合并树上两个点集并维护直径:维护一个点集内最远的两点,那么新的直径一定是这四个点之间之一的路径,维护深度即可。
那么考虑树链剖分,在一个重链上,用线段树维护直径长度,对于轻儿子,用 multiset 维护轻儿子的子孙中最深的关键点的深度,其中最大的最上文所述的为第一个点,次大的为第二个点,这样就可以在重链上合并,不难发现这样是对的。
修改时,修改自己和到根路径上的每一个链顶的父亲,并且修改 set 就行。
时间复杂度 \(O((n+q)\log^2 n)\),代码很不好写。
7.22
P3178 [HAOI2015] 树上操作 & P2590 [ZJOI2008] 树的统计 & P4315 月下“毛景树”
简单的重链剖分题,最后一题可以将边权放在离根远的那个点上。
我好糖啊,写几个树剖板题都写了一天。
还研读好文:《IOI2024 国家集训队论文 论现代硬件上的常数优化》——宋家兴。
7.23
P1144 最短路计数
不难发现,这个题边权恒为 \(1\) 所以直接 DAG 上 DP 写 BFS 即可。
注意,边权为 \(0\) 和 \(1\) 的图可以写 \(0-1\) BFS。
P1119 灾后重建
考虑 Floyd 本质:考虑每一个村庄是中转点,并 \(O(n^2)\) 枚举每两个点进行放缩,而最短路只会经过一个点一次所以 \(O(n)\) 次放缩即可。
那么对于每一个询问,直接每一个没有加入的点加入跑 \(O(n^2)\) 那么总时间就是 \(O(n^3+q)\)。
P5960 【模板】差分约束
对于每一组:
那我们就从 \(j\) 向 \(i\) 连一条 \(k\) 的边,并且从 \(0\) 向所有点连一条边权为 \(0\) 的边,在这上面从 \(0\) 开始跑 SPFA 就行了,距离就是 \(0\) 到每一个点的距离,有负环就是无解。
不会证。
P7771 【模板】欧拉路径
小学学的一笔画,判断是简单的,找的话对边排序之后搜一下就行。实现细节上直接写一个当前便利到那一条边了,下次从此开始即可。

浙公网安备 33010602011771号