复健笔记

复健笔记

P1536

把已经联通的块缩成一个,用并查集重编号,然后输出编号数 - 1 即可

P1955

\(x_1 = x_2\) 就放在一个联通块内,然后去验证 \(x_1 \neq x_2\) 的都成不成立即可

需要把操作离线下来离散化,先加并查集,然后再验连通性

P2330

最小瓶颈生成树,那直接上 kruskal 就完事了

P1821

\(n \leq 1000\),那直接跑 \(n + 1\) 遍最短路就可以了

时间复杂度 \(O(n^2\log n)\)

P1892

\(n \leq 1000\),于是就可以直接暴力找敌人的敌人了

首先把所有敌人关系存成双向图,然后枚举一个人为起点,把所有的边终点加入朋友并查集即可,也就是把第一个边终点和其他边终点分别合并

然后统计联通块个数

P3884

很简单的树上操作,因为是单次查询所以 LCA 也只需要暴力跳

P3110

首先走到一块之后就没必要分开了,除非恰好是重合的最短路径而且 \(p > b + e\)(其实这种情况下面的方法也能处理)

于是考虑枚举走到哪个点之后一起背着走,答案就是 Bessie 和 Elsie 分别走到这个点的距离加上这个点到终点的距离

也即从 1、2 开始的单源最短路和到 \(n\) 的单终点最短路(双向图,所以也是单源最短路)

P1525

最大值最小,于是考虑二分,之后做二分图染色判断,bfs即可,但是要注意二分误差

P4185

还不会

P4588

将操作视为一个按时间排列的序列,最终结果就是所有操作的乘积,于是开一个初始全是 1 的线段树维护即可

P1434

记忆化搜索板子

P2016

树形 DP 板子,设 \(\mathrm{dp}[u][0/1]\) 表示以 \(u\) 为根的子树中,在 \(u\) 点放置(1)不放置(0)士兵的情况下,需要的最少士兵数

转移方程:

\[\mathrm{dp}[u][1] = \sum_{v \in son(u)} \min\{\mathrm{dp}[v][0], dp[v][1]\}\\ \mathrm{dp}[u][0] = \sum_{v \in son(u)} dp[v][1] \]

\(u\) 点放置的时候,下面的 \(v\) 点放不放都可以,取最小;当 \(u\) 点不放置的时候,所有的 \(v\) 点都要放

posted @ 2023-07-28 18:53  Handwer  阅读(10)  评论(0编辑  收藏  举报