古典叙事 · 技术札记

序章

山河有卷
人间有声

写代码,也写长风、旧城与未熄的灯。
愿每一篇随笔,都有自己的山水与回声。
阅览随笔
摘要: CDQ 分治的核心思想是“用时间换空间,用分治降维度”。 当我们面对多维偏序问题(如三维 \(x_i \le x_j, y_i \le y_j, z_i \le z_j\))时: 第一维 (\(x\)):初始排序(通常是数组原本的顺序或按 \(x\) 排序)。 第二维 (\(y\)):在分治过程中进 阅读全文
posted @ 2026-09-08 20:51 Morphis‘ 阅读(5) 评论(0) 推荐(0)
摘要: 网络流 dinic算法 存图技巧:反向边是灵魂 不能只用 pair 存正向边。因为网络流在扣除正向容量时,必须同时增加反向边的容量以提供反悔机会。 标准写法: 用 struct Edge 存边,包含 to(终点)、cap(剩余容量)和 rev(反向边在对方邻接表里的下标)。 初始状态: 正向边容量为 阅读全文
posted @ 2026-08-30 15:34 Morphis‘ 阅读(2) 评论(0) 推荐(0)
摘要: 树的直径 直径就是树上两个节点中的最长距离 解法 跑两次dfs,先求出距离x最远的点y,再对y跑一次dfs计算最远距离 解法2dp维护最大与次大 long long diameter = 0; long long dfs(int u, int parent) { long long mx1 = 0; 阅读全文
posted @ 2026-08-18 19:48 Morphis‘ 阅读(6) 评论(0) 推荐(0)
摘要: 想提升图和树题的“思维广度”,最有效的不是背更多算法,而是建立一套判断流程: 先识别结构,再把题意翻译成标准模型,最后根据数据范围选择工具。 下面给你一套可以长期使用的框架。 一、拿到图论题,先问这 8 个问题 1. 图是什么类型? 先在草稿上标出来: 有向还是无向? 有权还是无权? 权值是否可能为 阅读全文
posted @ 2026-08-18 15:31 Morphis‘ 阅读(10) 评论(0) 推荐(0)
摘要: #include <bits/stdc++.h> using namespace std; using i64 = long long; const int N = 105; // 通常矩阵大小不超过 100 const i64 MOD = 1e9 + 7; i64 n, m; // 1. 将矩阵封 阅读全文
posted @ 2026-08-14 10:10 Morphis‘ 阅读(5) 评论(0) 推荐(0)
摘要: 用一个题目来讲解后缀数组 使用字符串 \(s\) 的子串来构造一个前缀码集合(Codebook),且集合中的任何字符串都不能包含子串 \(p\)。在所有合法子串构成的 Trie(字典树)中,构造“前缀码”实际上就等价于在这棵字典树上寻找非空反链(即选出的节点集合中,没有任何一个节点是另一个节点的祖先 阅读全文
posted @ 2026-08-13 17:00 Morphis‘ 阅读(12) 评论(0) 推荐(0)
摘要: 模型一:插板法(Stars and Bars / 隔板模型)物理场景 :把 \(n\) 个一模一样的苹果,分给 \(m\) 个不同的小朋友。触发关键词:相同的物品、分给不同的人、方程 \(x_1 + x_2 + \dots + x_m = n\) 的整数解个数。解法推导: 情况 A(每个人至少分 1 阅读全文
posted @ 2026-08-11 14:07 Morphis‘ 阅读(23) 评论(0) 推荐(0)
摘要: Prüfer 序列的作用: ————建立“无根标号树”与“一维数组”之间的完美双射(一一对应)。 一棵 \(n\) 个节点的树,必然能唯一对应一个长度为 \(n-2\),且值域在 \([1, n]\) 的序列;反之亦然。 一、 核心算法机制 不论是“树转序列”还是“序列转树”,最朴素的做法(每次找最 阅读全文
posted @ 2026-08-11 13:42 Morphis‘ 阅读(8) 评论(0) 推荐(0)
摘要: 概率DP 概率dp有两个很核心的思想 概率 DP(求某个事件发生的概率): 正向推导逻辑:由已知的初始状态(概率为 1)出发,沿着时间轴顺推,将概率按转移分支分散,直到目标状态。方程形态:\(P(\text{当前}) = \sum P(\text{前驱}) \times \text{转移概率}\) 阅读全文
posted @ 2026-08-04 20:49 Morphis‘ 阅读(19) 评论(0) 推荐(0)
摘要: 在状态压缩 DP 中,我们经常会遇到这样的问题: 给定一个数组 \(A\),我们需要求一个新的数组 \(F\),使得 \(F[mask]\) 等于 “\(mask\) 的所有子集”(或超集)的 \(A\) 值之和。 数学表达:\(F[mask] = \sum_{sub \subseteq mask} 阅读全文
posted @ 2026-07-30 19:41 Morphis‘ 阅读(16) 评论(0) 推荐(0)