![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法竞赛进阶指南
文章平均质量分 52
qq_38232157
这个作者很懒,什么都没留下…
展开
-
洛谷 P2886 [USACO07NOV]Cow Relays G(最短路,矩阵乘法,离散化)
最短路,矩阵乘法,离散化原创 2022-12-04 02:50:01 · 225 阅读 · 0 评论 -
洛谷 P1948 [USACO08JAN]Telephone Lines S(双端队列BFS,二分,最短路)
双端队列BFS,二分,最短路原创 2022-12-03 21:20:21 · 190 阅读 · 0 评论 -
洛谷 P4301 [CQOI2013] 新Nim游戏(线性基)
线性基原创 2022-11-21 18:57:04 · 569 阅读 · 0 评论 -
洛谷 P1099 [NOIP2007 提高组] 树网的核(树的直径,枚举)
树的直径,枚举原创 2022-11-18 00:57:41 · 139 阅读 · 0 评论 -
洛谷 P3304 [SDOI2013]直径(树的直径,最近公共祖先LCA)
树的直径,最近公共祖先LCA原创 2022-11-17 13:50:55 · 166 阅读 · 0 评论 -
洛谷 P4408 [NOI2003] 逃学的小孩(树的直径)
树的直径原创 2022-11-17 13:42:48 · 287 阅读 · 0 评论 -
洛谷 P2014 [CTSC1997] 选课(树形dp, 分组背包)
树形dp, 分组背包原创 2022-11-07 10:22:44 · 223 阅读 · 0 评论 -
洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树链剖分,最近公共祖先LCA)
树链剖分,最近公共祖先LCA原创 2022-11-06 15:20:17 · 81 阅读 · 0 评论 -
poj 3177 Redundant Paths(边双连通eDCC,缩点)
边双连通eDCC,缩点原创 2022-11-06 08:06:45 · 142 阅读 · 0 评论 -
洛谷 P1854 花店橱窗布置(算法竞赛进阶指南,线性DP)
算法竞赛进阶指南347页,线性DP题目:每一排选一个数,求一个最大的和,要求前一排选的数比后一排选的数靠左。本题要点:1、状态表示:dp[i][j] 表示前 i朵花,放入前j个花盆中,获得最大值。vis[i][j] = true, 如果 dp[i - 1][j - 1] + mp[i][j] > dp[i][j - 1]2、状态转移dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + mp[i][j]);3、输出方案:每一行从右往左找,找到原创 2020-10-12 16:16:17 · 232 阅读 · 0 评论 -
洛谷 P1090 合并果子(算法竞赛进阶指南,二叉堆)
算法竞赛进阶指南88页,二叉堆本题要点:1、二叉哈夫曼树,使用 priority_queue。2、priority_queue 默认是大根堆,这里直接往 队列中加 果子重量的相反数,即可。#include <cstdio>#include <cstring>#include <iostream>#include <queue>using namespace std;const int MaxN = 10010;int h[MaxN];in原创 2020-09-16 19:42:48 · 92 阅读 · 0 评论 -
CH_0802 占卜DIY(算法竞赛进阶指南,stl,模拟)
算法竞赛进阶指南48页,stl,模拟本题要点:1、用 deque 来存放每一对扑克, 因为 deque 可以两头放数据。 用数字,表示扑克的大小,deque2、4 条命,剩下的就是模拟运行过程。3、题目要求的是,每堆牌, 4张都要正面朝上,因此,用数组 turn[i] 来存放 第 i 堆正面朝上的次数。#include <cstdio>#include <cstring>#include <iostream>#include <vector>原创 2020-09-12 14:48:58 · 150 阅读 · 0 评论 -
POJ 2728 Desert King(算法竞赛进阶指南,最小生成树,0/1分数规划)
算法竞赛进阶指南368页,最小生成树,0/1分数规划题目意思:n个点,每个点以平面坐标 (x, y) 表示, 其海拔高度是 z。 点与点之间的距离就是 (x1, y1) 与 (x2, y2) 的平面距离 (这里用数组 a[MaxN][MaxN] 来存)。点与点之间的高度差值的绝对值,叫做成本(这里用数组 b[MaxN][MaxN] 来存)。题目要求,找到一个图的生成树,使得这棵树 总的成本 sum{成本} / sum{距离} 最大。本题要点:1、 二分法,构造一个新的无向图, 边的权值 是 a原创 2020-09-05 22:22:42 · 135 阅读 · 0 评论 -
洛谷 P1313 计算系数(算法竞赛进阶指南,快速幂,组合数,乘法逆元)
算法竞赛进阶指南,171 页,快速幂,组合数,乘法逆元本题要点:1、通过二项式定理,求出 x^n * y^m 项的系数是 C[n][k] * a^n * b^m.2、幂 的计算 a^n 直接使用快速幂计算, 假设得到结果是 ans;3、组合数 C[n][k] 的计算:先计算 k! , 再计算阶乘 n! * (k - n)! 模p的逆元。 p是素数,那么欧拉定理有: t^(p - 1)=1(mod p), 也就是t 模p的逆元是 t^(p - 2)。因此 n! * (k - n)! 模p的逆元原创 2020-07-14 21:16:21 · 165 阅读 · 0 评论 -
洛谷 P4316 绿豆蛙的归宿(算法竞赛进阶指南,概率数学期望, 拓扑排序)
算法竞赛进阶指南,182 页,概率数学期望本题要点:1、dis[x] 表示点x到终点所有经过的路径的期望长度。如果从点x出发有k条边,分别到达 y[1], y[2], …, y[k], 边长分别是 z[1], z[2], …, z[k]那么dis[x] = 1 / k * sum{dis[y[1]] + z[1], dis[y[2]] + z[2], …, dis[y[k]] + z[k]}显然 dis[n] = 0;2、建立原来图的反向图,求反图的拓扑排序,顺便计算每一点的 dis[i]。#原创 2020-07-14 21:04:30 · 178 阅读 · 0 评论 -
POJ 1325 Machine Schedule(算法竞赛进阶指南,二分图最小点覆盖)
算法竞赛进阶指南,434页,二分图最小点覆盖题目意思:有两台机器A和B,分别有n种和m种不同的模式,有k个工作,每个工作都可以在那两个机器的某种特定的模式下处理。如job0既可以在A机器的3好模式下处理,也可以在B机器的4号模式下处理。机器的工作模式改变只能通过人工来重启。通过改变工作的顺序,和分配每个工作给合适的机器可以减少重启机器的次数达到最小。任务就是计算那个最小的次数。初始时两台机器都运行在0号模式下本题要点:1、二分图最小点覆盖问题:每个作业 i 可以以机器A 的 a[i]模式运行原创 2020-07-13 21:55:35 · 142 阅读 · 1 评论 -
POJ 2226 Muddy Fields(算法竞赛进阶指南,二分图最小点覆盖)
算法竞赛进阶指南,434页,二分图最小点覆盖题目意思:在 n * m 的网格,有些格子泥泞,有些干净的,现在用宽度为1, 长度随意的木板覆盖泥泞点,但不能覆盖任何的干净点。木板可以重叠,问最少需要多少块木板。本题要点:1、首先木板覆盖的只能是单个的泥泞点, 或者是连续的若干个泥泞点。木板不能覆盖 干净点。依次扫描每一行,碰到连续的若干个泥泞点,就用一块木板覆盖该点。每一块木板编上编号,从1 开始, 这些编号叫做 行泥泞块。同理,依次扫描每一列,得到 列泥泞块。以 行泥泞块 块为左部节点, 列原创 2020-07-13 21:41:03 · 103 阅读 · 0 评论 -
洛谷P1541 乌龟棋(算法竞赛进阶指南,线性dp)
算法竞赛进阶指南,347页,线性dp本题要点:1、状态表示:f[a][b][c][d]:表示你出了a张爬行牌1,b张爬行牌2,c张爬行牌3,d张爬行牌4时的得分2、转态转移方程:假设牌1, 牌2,牌3,牌4分别出现了 a, b, c, d次。当前的坐标是x。 有x往回走1步,对应的最大得分是 f[a - 1][b][c][d],同理, 有x往回走2步,对应的最大得分是 f[a][b - 1][c][d],有x往回走3步,对应的最大得分是 f[a][b][c - 1][d],有x往回走3步,原创 2020-07-03 00:36:36 · 165 阅读 · 0 评论 -
CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)
算法竞赛进阶指南,278页,完全背包本题要点:1、把完全背包的代码改改即可。常规的完全背包:有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每个物品可以选任意多次)。f[j]表示到小为i的背包,最多能获得的最大价值f[j] = max(f[j], f[j - v[i]] + w[i]); // j从小到大扫描2、题目意思转换:有n个物品,每个物品的体积是v[i], 价值是1, 求装到大小为m的大背包,一共有多少种装法。f[j]表示到小为i的原创 2020-07-02 22:48:18 · 174 阅读 · 0 评论 -
CH5101 LCIS(算法竞赛进阶指南,线性dp)
算法竞赛进阶指南,266页,线性dp本题要点:1、转态表示f[i][j], 表示在 a[1] ~ a[i] 范围内,b[1] ~ b[j] 范围内,以b[j]结尾的LCIS 的长度2、转态转移方程a[i] != b[j], f[i][j] = f[i - 1][j];a[i] == b[j], f[i][j] = 1 + max{f[i - 1][k], 0 <= k < j}#include <cstdio>#include <cstring>#in原创 2020-07-02 20:34:54 · 130 阅读 · 0 评论 -
CH 5201 数字组合(算法竞赛进阶指南,01背包)
算法竞赛进阶指南,277页,01背包本题要点:1、把01背包的代码改改即可。常规的01背包:有n个背包,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值。f[j]表示到小为i的背包,最多能获得的最大价值f[j] = max(f[j], f[j - v[i]] + w[i]);2、题目意思转换:有n个背包,每个物品的体积是v[i], 价值是1, 求装到大小为m的大背包,一共有多少种装法。f[j]表示到小为i的背包, 一共有多少种装法:f[j] = f[j原创 2020-07-02 20:32:54 · 248 阅读 · 0 评论 -
洛谷 P2568 GCD(算法竞赛进阶指南,素数线性筛法,欧拉函数)
算法竞赛进阶指南,190页,素数线性筛法,欧拉函数本题要点:1、线性筛法求素数的同时, 求出欧拉函数。其中使用了欧拉函数的两个性质:a) a, b 互质,那么 phi(a * b) = phi(a) * phi(b)b) p 是素数, p^2 能整除 n,那么phi(n) = phi(n / p) * phi§2、 数组phi[i] 中存放的是 欧拉函数的前缀和,使用 long long 来存。3、 对于某个数 k, phi[k]表示 小于等于k的数中,有多少个数对(x, y) 互质(x &l原创 2020-07-01 11:44:52 · 226 阅读 · 0 评论 -
CH 3101 阶乘分解(算法竞赛进阶指南,阶乘的素因子分解)
算法竞赛进阶指南,138页,阶乘的素因子分解本题要点:1、直接套用阶乘的质因数分解公式, n的阶乘中,n! 含有素数p 的因子个数为[n / p] + [n / p^2] + [n / p^3] + … + [n / p^k] + …2、先用线性筛法打个素数表, 然后扫描素数表,对于每一个 p <= n 的素数,执行上面的公式计算素因子的个数。3、 比较 p^k 和 n的大小关系,使用 long long#include <cstdio>#include <cstri原创 2020-07-01 11:18:51 · 297 阅读 · 0 评论 -
洛谷 P1082 同余方程(算法竞赛进阶指南,扩展欧几里得, 线性同余方程)
算法竞赛进阶指南,153页,扩展欧几里得, 线性同余方程本题要点:1、同余方程 a * x = 1(mod m), 转化为 方程 a * x + b * y = 1, 利用 扩展欧几里得算法,求出一组特解,x0 和 y0, x0 就是原来同余方程的一个解, 但是要求最小的正整数解,只需要把 x0 同余模 到 1 ~ b 的范围内。2、避免麻烦,直接 long long#include <cstdio>#include <cstring>#include <ios原创 2020-06-30 21:42:10 · 142 阅读 · 0 评论 -
POJ 3070 Fibonacci (算法竞赛进阶指南,矩阵乘法)
算法竞赛进阶指南,156页,矩阵乘法本题要点:1、 n <= 2 * 10^9, 如果使用迭代法计算 斐波那契数列,显然会超时。2、 题目给出了提示, 2 * 2 阶矩阵(假设叫特殊矩阵) 的n次方,得到的矩阵,就是 fib[n], fib[n - 1], f[n - 1], f[n - 2]当然计算矩阵的n次方,不能一个一个的成,那样时间复杂度也是 O(n).应该使用二进制的方法,扫描 n 值得二进制的每一位,看看是不是1, 用矩阵B 来存放 特殊矩阵 的 2, 4, 8, 16 次方,…原创 2020-06-30 21:25:38 · 143 阅读 · 0 评论 -
POJ 3696 The Luckiest number(算法竞赛进阶指南,欧拉函数,快速幂)
算法竞赛进阶指南,150页,欧拉函数,快速幂题目意思:题目给定一个正整数 L, 问有至少多少个连续的8组成的正整数是 L 的倍数。书上的思路:1、 888888 这个式子来表示:k * (10^x - 1) / 9进而简化:8 * (10^x - 1) / 9 = L * k (k是一个整数)8 * (10^x - 1) = 9L * k, 假设 d = gcd(8, L), 那么 (10^x - 1) = k * (9L / d), 从而10^x = 1(mod 9L / d)书上的引理:原创 2020-06-30 15:47:43 · 98 阅读 · 0 评论 -
洛谷 P1072 Hankson 的趣味题(算法竞赛进阶指南,素数)
算法竞赛进阶指南,143页,素数本题要点:1、gcd(a, x) = c, lcm(b, x) = d。 因为x是d的约数,x的素因子也是d的素因子。对于d的每一个素因子, ma, mb, mc, md, mx 分别表示a, b, c, d, x中含有的素因子个数.2、因为最大公约数 gcd(a, x) = c, 因此a)ma > mc, mx 只能等于 mcb)ma == mc, mx >= mc即可c)ma < mc, 无解3、 因为最小公倍数 lcm(b, x) =原创 2020-06-30 11:37:46 · 190 阅读 · 0 评论 -
洛谷 P2261 [CQOI2007]余数求和(算法竞赛进阶指南, 数学推导)
算法竞赛进阶指南, 141页,数学推导本题要点:1、 k mod i = k - [k / i] * i, 答案就是 n * k - sum{[k / i] * i}(1 <= i <= n)记 g(x) = [k / [k / x]], 可以证明 , [k / g(x)] == [k / x]从而,x 在 区间[i, g(i)] 的范围内,[k / x] = [k / i],也就是说, i <= x <= g(i)时候, [k / x] * x 形成了一个等差数列,首项原创 2020-06-30 00:28:42 · 140 阅读 · 0 评论 -
洛谷 P1073 最优贸易(算法竞赛进阶指南,最短距离,spfa)
算法竞赛进阶指南, 356页,最短距离,spfa算法本题要点:1、 本题求一条从1点到 n点的路径, 先过 p点,在过q点,使得 q点的权值减去p点的权值最大。2、两个图,图1 是按题目给的数据建一个有向图,图 2 将 图1的所有边取反。两个 spfa, spfa1 从1点出发,d1[x] 表示1点到点x的路径上的权值最小的点。spfa2 从n点出发,d2[x] 表示n点到点x的路径上的权值最大的点。然后, d2[x] - d1[x] 的最大值就是答案。3、首先, dijkstra 算法,求路原创 2020-06-29 19:37:39 · 213 阅读 · 0 评论 -
HOJ 2586 How far away ?(算法竞赛进阶指南,树上倍增法,最近公共祖先LCA)
算法竞赛进阶指南, 376页,树上倍增法求 最近公共祖先LCA题目意思:求任意两点的距离。先求出任意两点的 LCA(x, y), 然后答案就是:dist[x] + dist[y] - 2 * dist[lca(x, y)]本题要点:1、以点1为根,d[i]表示从i到根的深度(d[1] = 1); dist[i] 表示i到1点的距离。f[i][k] 表示 点i 向上走 2^k 步到达的节点号, 如果该节点不存在, 就令 f[i][k] = 0。f[i][0]就是节点i的父节点。除此之外, 动态规原创 2020-06-29 17:17:36 · 99 阅读 · 0 评论 -
洛谷 P1463 [POI2002][HAOI2007]反素数(算法竞赛进阶指南, 素数,搜索)
算法竞赛进阶指南, 140页,素数,搜索本题要点:1 、1 ~ N之间的反素数,就是 1 ~ N 中约数最多的数中最小的一个。2、 n <= 2 * 10^9, 考虑到 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 *23 * 29 * 31 > 2 * 10^9,n不可能有多于 10 个的素因子。3、 同样的素因子组成结构,素因子越小越好。 比如 4312 = 2^3 * 7^2 * 11 , 这个数由, 3, 2, 1 个不同的素因子组成。4312 的 约原创 2020-06-29 13:28:27 · 139 阅读 · 0 评论 -
POJ 1041(算法竞赛进阶指南,欧拉回路)
算法竞赛进阶指南, 455页,欧拉回路题目意思:有若干条边,连上若干点,每组输入的数据 以 0 0 隔开。 这些点构成了一个连通块,求这个连通块的欧拉回路。本题要点:1、题目输入,连续遇到两个 0 0 , 就结束输入。用 do while 来做比较好。这里写的比较土。2、欧拉回路,记录的是每一条边的权值(可以看做是边的编号)3、poj上面的实际数据,数组大小要开到 1000 以上(大于44)。这里只是 special judge ,不需要最小字典序。#include <cstdi原创 2020-06-28 13:22:52 · 210 阅读 · 0 评论 -
POJ 2230 Watchcow(算法竞赛进阶指南,欧拉回路)
算法竞赛进阶指南, 411页,欧拉回路(一笔画)题目意思:n个点,m条边的无向图,求一条路径,从1点出发,每条边(正反两个方向)都走一遍,输出走的点的顺序。本题要点:1、使用邻接表来存图,每访问完一条边 (x, y), 及时修改表头 head[x], 使得它指向吓一跳边。这样每次都取出 head[x], 自然就跳过了所有访问过的边。2、用数组模拟栈(如果是系统栈,可能爆栈)。回溯过程中,弹栈,用 ans 数组来接,然后数组 ans 存放的就是欧拉回路的所有点的顺序。#include <原创 2020-06-28 01:09:20 · 96 阅读 · 0 评论 -
CH 6802 車的放置 (算法竞赛进阶指南,二分图最大匹配, 增广路算法)
算法竞赛进阶指南, 427页,二分图最大匹配本题要点:1、二分图最大匹配增广路算法的模板题。本题中,MaxN= 200,可以用邻接矩阵来存储图。二分图的左部是 n 行, 右部是 m列。行与行之间没有连线,列与列之间也没有连线。每行, 每列只能放一个车,格子(i, j) 放了车,相当于第i行与第j列有连线。2、增广路算法:扫描左部的每一个点x,寻找一个匹配的右部节点y。 y满足一下的条件a) y 本身是非匹配点b) y本身与x1 匹配,但从 x1 出发,能找到另外一个 y1 与之匹配, 此时路径原创 2020-06-28 00:36:30 · 142 阅读 · 0 评论 -
洛谷 P4168 [Violet]蒲公英(算法竞赛进阶指南,分块, 离散化)
算法竞赛进阶指南, 227页,分块, 离散化本题要点:1、先离散化,编号的大小为 10^9, 而元素个数为 5 * 10^52、 分块,将 n 个数值,平均分为 sqrt(n * log(n)) 段。 f[i][j]表示从第i段到第j段,出现最多的蒲公英编号。3、数组 f[T][T]的计算,详细看代码。4、 假如区间 [l ,r] 包含3 部分,中间是若干完整的段 [L, R],两边是不完整的段 [l, L), (R, r] ,那么中间部分,直接得到出现最多的是哪个编号(f[L][R]), 并原创 2020-06-26 22:41:11 · 316 阅读 · 0 评论 -
洛谷 P2234 [HNOI2002]营业额统计(算法竞赛进阶指南,平衡树)
算法竞赛进阶指南,238页,平衡树本题要点:1、该天的最小波动值=min{|该天以前某一天的营业额-该天营业额|}。每天的最小波动值, 实际就是改天的营业额 cur 和之前的所有营业额一起排序,计算出 cur 与相邻两个营业额之间的差值的较小值,就是 该天的最小波动值2、平衡树容易满足,每天的营业额 income 插入到这颗 平衡树中,计算出 income 的前驱 pre 和后继 next,该天的最小波动值 = min( abs(income - pre), abs(income, next))原创 2020-06-25 23:59:59 · 342 阅读 · 0 评论 -
洛谷 P3369 【模板】普通平衡树(算法竞赛进阶指南,普通平衡树,模板 )
算法竞赛进阶指南,238页,普通平衡树,模板本题要点:1、设计普通普通平衡树的,增加,删除,左旋,右旋,前驱,后继,按值查排名, 按排名查询值等等操作。2、代码抄书上的,作为模板参考。#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>using namespace std;const int MaxN = 100010;int tot, root原创 2020-06-25 20:34:30 · 151 阅读 · 0 评论 -
洛谷 P3008 [USACO11JAN]Roads and Planes G(算法竞赛进阶指南,最短路径)
算法竞赛进阶指南,357页,最短路径,拓扑排序本题要点:1、因为图有负权,不能只用dijkstra 来处理。直接用 spfa 算法,本题的数据会超时。2、本题中,双向的道路是正数,而单向的航班,有可能是负权。如果在图中只加道路,那么图会分为几个连通块,对于块内的点,通过堆优化的dijkstra算法更新最短路;3、 把连通块的所有点都缩为一个点,再添加航路,则图变成了一个有向无环图,可以按拓扑顺序扫描,线性时间求出最短路径。4、 具体步骤:a)求出每个点所在的连通块编号(c[i]), 统计每个原创 2020-06-25 15:58:13 · 258 阅读 · 0 评论 -
洛谷 P3469 [POI2008]BLO-Blockade (算法竞赛进阶指南, 图的割点)
算法竞赛进阶指南,399页, 图的割点本题要点:1、用 ans[i]记录每一个点去除之后的答案:如果 i点不是割点,去除i点后,答案应该是 2 * (n - 1), 原图分为了两个连通块 ,i 点 和其他部分;如果 i点是割点, i点的 所有的子节点中,有 t个(假设为 s[1], s[2], …, s[k])满足 dfn[i] <= low[s[k]],1)那么原图最多有 t + 2 个连通块2)节点 i 自身为一个连通块,3)有 t 个连通块,由搜索树上以 s[j] (1 <原创 2020-06-24 17:28:52 · 155 阅读 · 0 评论 -
洛谷 P1525 关押罪犯(算法竞赛进阶指南, 并查集,贪心)
算法竞赛进阶指南,261页,并查集,贪心本题要点:1、贪心:先把所有的边从大到小排序,然后依次将边的两个点分到不同的两监狱中。(越大的怒气值的一组罪犯应分在两个不同的监狱里)如果选到某一条边,这条边的两个端点恰好在同一个集合中,说明这条边的长度就是答案。2、使用并查集:扫描每条边,两个端点(假设两个点为a, b点)位于不同的监狱中,这两个点互为敌人;如果a点有敌人(enemy[a] != 0),说明之前a点已经被分配到某个监狱了, 那么b点应该加入 enemy[a] 所在的集合;如果a点原创 2020-06-21 21:17:47 · 196 阅读 · 0 评论