15 个默写模板按 图论 / 组合 / 倍增 / 树形 DP 四大类组织,覆盖八级编程题主要高频型。目标不是"看懂",而是合上清单、限时默写到能 AC。每个模板可一键盖住骨架自测。
用法:每个模板 ①先盖住骨架自己默写 → ②点开对照检查 → ③做自测题限时 AC → ④回看易错点。所有骨架均为 C++14,已编译跑过样例。
大数组开全局;涉及计数 / 距离和一律 long long + 随时取模。
k 一定在最外层,写到里面就错。d[i][k]<INF && d[k][j]<INF 防溢出。priority_queue<pli, vector<pli>, greater<pli> >(注意两个 > 之间空格)。dist 用 long long;if(dd>dist[u])continue; 不能漏。auto [d,u],旧评测会报错。find 不同才合并(避免成环)。for(i)fa[i]=i 初始化。long long;判 cnt==n-1 确认连通。dis[v] 是"v 到当前树的最短边",不是源点最短路(别和 Dijkstra 混)。dis[1]=0 才能启动;累加 tot 用 long long。u 若 dis[u]==INF,说明图不连通。find 到根;判连通用 find(a)==find(b)。order.size())是否 <n。u 比 v 先算完。--indeg[v]==0 时入队,别重复入队。C(n,m),n、m 不大(≤2000~5000);模数可能不是质数。最不易错的求组合数法。C(i,0)=1;内层只算 j<=i。C(n,m)/排列数/方案数,n 很大(1e5+),对质数(如 1e9+7)取模,式子里有除法/阶乘。inv(x)=x^(MOD-2),前提 MOD 是质数。1e9(非质数)不能用费马逆元,改杨辉三角递推或多重集直接连乘整除。long long + 随时取模。逆元:模 p 下没有除法。要"除以 a"就乘 a 的逆元 inv(a),它满足 a · inv(a) ≡ 1 (mod p)。组合数 C(n,m)=n!/(m!(n-m)!) 带除法,于是把 ÷m! 换成 ×inv(m!)。
费马小定理:p 是质数、且 a 不是 p 的倍数时,a^(p-1) ≡ 1 (mod p)。两边同除以 a 得 a^(p-2) ≡ a^(-1) (mod p),所以 inv(a) = a^(p-2) mod p(用快速幂算,见模板 10)。
前提:p 必须是质数。p 非质数(如 1e9)时费马失效,改用杨辉三角递推(模板 7)或多重集直接整除。
其它求法:扩展欧几里得(只要 gcd(a,p)=1,不要求 p 质数);批量求 1..n 的逆元用线性递推 inv[i] = (p - (p/i)*inv[p%i]%p) % p。
for(d=1;d<=K;d++) for(m=d;m<=K;m+=d) cnt[m]+=...;,复杂度 O(K log K)。P10263 因数统计就是这套路。核心递推 f[i][j] = f[f[i][j-1]][j-1](跳 2^j = 先跳两次 2^(j-1));查询时从高位 j 往低位 0 试跳,能跳就跳。五种考法:① LCA / k 级祖先 ② 快速幂 ③ 序列/状态跳跃 ④ 路径最值 ⑤ ST 表。本质都是"按 2 的幂翻倍"。
up[a][j]!=up[b][j](不相等才跳),最后返回 up[a][0]。dep[a]+dep[b]-2*dep[lca(a,b)](常考,背下来)。dep[a]-dep[b] 级祖先。a^b mod p(b 很大);也是求乘法逆元的基础(inv(x)=power(x,MOD-2))。a=a*a 是"底数翻倍 → 对应指数的 2 的幂",和 LCA 的 up 翻倍同构。long long 防溢出;结果 r 初值为 1。inv(x)=power(x,MOD-2)(费马小定理,见 8)。nxt[i]",要快速求"从 i 连跳多步到哪 / 在限制内能跳几步"。接竹竿、宝石项链、国旗计划全是这型。f[][0] 指向哨兵,否则会跳进 0 号下标把 2^k 全加上(宝石项链样例会算出 26 万而非 3)。nxt[i] 常用双指针(宝石项链:先求每个起点最短合法段)或倒序扫记录上次出现(接竹竿)预处理。mx[][j] 取进 res。mx[a][0]、mx[b][0] 不能漏。up[][],只多开一个 mx[][];边权挂在子节点。r-(1<<k)+1(贴右端),别写成 l+(1<<k)。d1+d2+1(两条向下链 + u 自己);返回只给父亲 d1+1。vis[] 标记,对每个未访问根各跑一次 dfs。fa[L],边差分扣 2*L——两者端点扣法不同。up、dep、fa)。需要输出不取模的精确大整数时(如 P1037 产生数),用 vector<int> 存每一位(低位在前)写高精度乘法 / 加法。日常计数题能取模就取模,能不用高精度尽量不用。
| 天 | 默写模板 | 限时自测(≤40 分钟/题) |
|---|---|---|
| 6/22 | 图论·最短路(Floyd / Dijkstra) | B3647 / P10726 |
| 6/23 | 图论·MST(Kruskal / Prim)+ 并查集 + 拓扑/DAG | P3366 / P14080 / P11380 |
| 6/24 | 倍增(LCA / 快速幂 / 序列 / 路径)+ ST 表 | P3379 / P14924 / P3865 |
| 6/25 | 组合(杨辉三角 / 逆元)+ 树形 DP + 树上差分 | P2822 / P10112 / P11251 / P3128 |
| 6/26 | 全部盖住各默 1 遍 | 订正 / 重写 6/25 模拟中暴露的 2 个核心函数,不再新开陌生题 |
GESP8 · 八级编程模板默写清单 · C++14 · 离线可用