
今天先复盘模拟赛,再讲暴力骗分与打表,最后把 DFS 和 BFS 的进阶写法补齐。

一小时:每题 10~15 分钟,从关键观察讲到易错点。
T 组询问,每组给三组节目的效果 a,b,c 和人数 x,y,z(都不超过 2×10⁹)。比较 a/x、b/y、c/z 三个分数,输出最大那组的编号,并列时输出编号小的。
T 组询问,每组一个正整数 N(N ≤ 10⁹)。两人轮流把当前数的各位数字相加,得到的新数当作下一轮的当前数;轮到你时如果已经是一位数,算出来还是它本身,你就输了。先手赢输出 S,输输出 M。
N 个人依次住在位置 1~N,每人属于一班或二班。同班两人距离 ≤ K₁、不同班距离 ≤ K₂ 就算互为邻居。输出每个人的邻居个数(2 ≤ N ≤ 3000,距离按位置之差算)。
n 个数,q 次询问。每次临时把整个数组改成 a_i 与 k(op=0)或者 a_i 或 k(op=1),求区间 [l,r] 的异或和,问完恢复原数组(n, q ≤ 2×10⁵)。
子任务、特殊性质、打表:每一档都能换成分。
按刚才那张表,一档一档写下来。
小木棍是构造题,暴力搜不出来——但“答案本身”可以先跑出来。
先写暴力跑 n = 1..20,把答案抄下来。
把刚才归纳出的规律,写成不用搜索的构造。
把 10⁵ 个号码铺开,逐个判定。
输入一个「MM-DD」形式的字符串,问最少改几位数字才能变成真实日期。题面不给年份,并规定 2 月固定 28 天。
n 位选手依次公布成绩(0~600)。当前获奖名额 = max(1, ⌊i × w%⌋),问每公布一人后的获奖分数线。
同一套递归框架,靠剪枝、加深和折半撑住指数级的规模。
回到社团招新:先各取最优,超了再调回来。
一科 4 道题,耗时 9 7 5 3,总和 24,下界 ⌈24/2⌉ = 12;先做耗时的题,目标 min max(左手, 右手)。
接着上面的场景:每层 2 个分支的搜索树,答案在深度 2。
接着上一帧那道题:4 场比赛,票价 3 5 7 11,预算 16,问几种观赛方案。
数一数朴素递归 w(15,15,15) 到底调用多少次。
回到 Function:把 memo 表加进递归里。
网格、多源、状态、双向:同一个队列,四种花样。
接着上面的场景:3×3 网格,(2,2) 是障碍,从 (1,1) 出发。
四个零件装上去,网格题就有一套固定写法。
机器人站在网格上,每步要么往前走一格,要么原地右转;走完 k 步,问它经过了多少个不同的格子(含起点)。
接着起火那道题:一排 5 个格子,火源在 1 号和 5 号。
接着加工零件:两种状态设计,看哪一种能回答问题。
回到加工零件:状态扩成 (工人, 步数奇偶)。
接着上面的场景:每个状态 2 个后继、2 个前驱的状态图,起点第 0 层、终点第 4 层。
今天先复盘模拟赛的四道题,再讲三块:0-1 BFS、Floyd 的三个视角、反图与最短路计数。

路线、纸带、对称差、消消乐
同类走一步 0 元、异类 1 元 —— 队列得两头都能进。
3 × 3 的棋盘,起点 (0, 0)、终点 (0, 2);每一步都记下队列长什么样。
回到小明的游戏:把 BFS 的队列换成双端队列,其余一个字不改。
N × M 的电路板,每格一条对角导线;电源在左上、灯在右下,元件可转 90°,问最少转几个才能点亮。N, M ≤ 500,时限只有 150 ms。
原始视角看阶段,矩阵视角看乘法,应用视角看改法。
就用这张图:5 个点、8 条有向边 —— 1→2:3、1→3:8、2→3:2、2→4:5、3→4:1、3→5:9、4→5:4、5→1:6。
N = 4,重建时间 t = [1, 2, 3, 4];每推进一个村庄就跑一轮 Floyd。
回到灾后重建:把 Floyd 的三重循环拆开,每来一个村庄只跑一轮。
求一个至少含 3 个点、节点不重复的环,让环上边权和最小。n ≤ 100,m ≤ 5×10³;无向图重边取小的那条,无解输出 No solution.(带句号)。
有些问题从终点出发反而好算,有些问题要数清楚到底有几条路。
样例 2:n = 6、m = 6,边是 1→2、1→3、2→6、2→5、4→5、3→4;s = 1、t = 5。
回到寻找道路:反图定“谁能到”,正图定“走几步”。
n 个点、m 条单向道路(n ≤ 10³,m ≤ 10⁵,1 ≤ w ≤ 10⁴,任意两点互相可达)。邮局在 1 号点,每次只能带一件,每送完一件都要先回邮局,求最少总时间。
样例:5 个点、7 条边 —— 1-2、1-3、2-4、3-4、2-3、4-5、4-5(4 和 5 之间有两条重边)。
回到最短路计数:dis 和 cnt 在同一次 BFS 里一起推出来。
今天先复盘模拟赛四道题,再讲带权、拓展域并查集与应用,最后把分层图补齐。

一小时:每题 10~15 分钟,先把关键观察讲透,再点易错的地方。
并查集不止能判连通:每个点再存一个数,就能记住它和根的关系。
拿官方样例的前五句话走一遍 —— 关系不是背下来的,是被逼出来的。
回到食物链:把每句话转成一个 rel,剩下的交给并查集。
n 个人、m 条亲戚关系、p 次询问(都 ≤ 5000):亲戚关系可以传递,问给定的两个人是不是亲戚,每行输出 Yes 或 No。
一个点拆成两个点,“不能在一起”就变成了“连在一起”。
4 个人编号 1~4,点 i 表示“i 在第 0 类”,点 i′ 表示“i 在第 1 类”。
两种写法复杂度一样,选哪个只看关系能不能“算”。
样例:n = 6,四条关系 E 1 4、F 3 5、F 4 6、E 1 2;拆点后 1 ~ 6 是本人,7 ~ 12 是对立面。
回到团伙:开 2n 个点,朋友一起并、敌人交叉并,最后数根。
n=4、m=4、k=2;四条城市路:1–4(6)、2–3(7)、4–2(5)、4–3(4)。
回到道路修复:枚举乡镇子集 + 最小生成树,写成一段。
N 名罪犯关进两座监狱,M 对仇恨 (a, b, c);让同一监狱内最大的 c 尽量小。N ≤ 2×10⁴,M ≤ 10⁵。
把“用掉一次机会”画成一条边,算法还是那个算法,状态多了一维。
接着上面的规则:原图 5 点 7 边,起点 1、终点 5,免费坐 1 条边。
回到飞行路线:把“免费 k 次”铺成 k+1 层,再跑一次最短路。
拿样例 5 5 3 跑一遍状态表:状态是 (点, 时刻 mod 3),dis 记最早到达时刻。
回到旅游巴士:把“时刻 mod k”当成层,剩下的就是分层图上的最短路。
回到道路拆除:三遍 BFS 拿距离,再枚举交点。