《算法竞赛进阶指南》刷书之旅
记录我的实时感受
逐梦起航-带梦飞翔
为了更加长远的快乐!
展开
-
二分图中的可行边与必须边—求法
定义二分图的最大匹配的方案可能是有多种的,其中无论如何都要选的边叫必须边;可选可不选,选了也能够得到最大匹配的叫可行边。简化版:完备匹配在能够完备匹配的二分图中,求必须边和可行边相对简单,我们先来讨论这个问题。先对这个二分图(左边右边都是n个点)做一次最大匹配,现在所有的点都是匹配点了,匹配边有n条。在此图中,把匹配边反过来,即从右往左连,非匹配边不变,仍是从左往右。一条边(x...原创 2018-10-07 11:55:42 · 1170 阅读 · 3 评论 -
欧拉路问题—详解
先区分几个概念欧拉路:从一个点S出发,不重不漏的经过每条边(允许重复经过一个点),最终去到另一个点T,的一条路径。欧拉回路:从一个点S出发,不重不漏的经过每条边(允许重复经过一个点),最终回到这个点S,的一条路径。欧拉图:存在欧拉回路的无向图。这两种路的判定应该不用我讲吧?不会的请翻阅《金牌奥数(五年级)》判定完后就是要求其方案了欧拉路:这个好处理,起点终点都给了只要拼命找就好了。...原创 2018-10-06 21:23:51 · 17859 阅读 · 0 评论 -
poj2279 Mr. Young's Picture Permutations(线性DP)
题目一个k行,每行n[i]个数字的容器。给出Σn[i]个数字,填入该容器,使得每一行递减,每一列递减。求方案数。(k<=5,Σn[i]<=30)思考一般人会去思考,给第(i,j)填x的方案数。这样问题就很复杂了,因为当填(i,j)时,要考虑(i-1,j)和(i,j-1)两个格子的数字,而DP又不便记录。我们换一种想法,先说说一种朴素做法。记目前每行已填了(a[1],a[2...原创 2018-09-17 11:22:07 · 377 阅读 · 0 评论 -
CH5302 金字塔(区间DP)
题目虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下。经过多年的研究,科学家对这座金字塔的内部结构已经有所了解。首先,金字塔由若干房间组成,房间之间连有通道。如果把房间看作节点,通道看作边的话,整个金字塔呈现一个有根树结构,节点的子树之间有序,金字塔有唯一的一个入口通向树根。并且,每个房间的墙壁都涂有若干种颜色的一种。探险队员打算进一步了解金字塔的结构,为此,他们使用了一...原创 2018-09-18 22:27:57 · 963 阅读 · 2 评论 -
洛谷CF311B Cats Transport(DP)(斜率优化)
题目洛谷CF311B Cats Transport题解斜率优化设的距离为,即。先转换一下模型。对于第i只猫,饲养员要在t[i]-D[i]之后出发,才能把它带回家。故我们设数组,问题就转换成了在A数组中分成p组,每组(l,r)的代价是。为了方便操作,对A进行递增排序。同时,记录其前缀和S。在此基础上,设f[i][j]表示出动j个饲养员带走前i只猫的最小等待时间。转移方程:...原创 2018-09-25 10:48:00 · 403 阅读 · 0 评论 -
CH5A01&BZoj2726 任务安排(DP)(斜率优化)
例题CH5A01 任务安排1题解1DP设f[i][j]表示把前i个机器分成j批修理的最小费用,St,Sc分别对应数组t和c的前缀和。容易写出一个O(n^3)的DP方程:但是这个方法显然不够优秀。我们可以考虑去掉分成j批这一维,并用“费用提前计算”的思想来维护新的f。方程如下: 题解2DP+斜率优化我们把i看做定量,j看做变量,然后把所有仅与j有关的(决...原创 2018-09-25 12:00:54 · 345 阅读 · 0 评论 -
poj2282 The Counting Problem(数位DP)
题目给定[l,r]输出其中每个数位上的数字出现的次数。(下面所指的“数字”均指的是0,1,2,3,…,9)。题解数位DP爽!第一道自己做出来的数位DP!!!设f[i]表示i位数字中,一个数字出现的次数(首位可以为0);则有f[i]=f[i-1]*10+10^(i-1)的递推式。数字0是比较特殊的,我们要单独为其设立g[i],表示首位不为0的出现次数;则有g[i]=g[i-1]+f...原创 2018-09-27 13:17:15 · 336 阅读 · 0 评论 -
poj1038 Bugs Integrated, Inc.(状压DP)
题意在空余位置放入尽量多的2*3或3*2的矩形。题解状压DP对于横着0,1没问题,对于竖着的,还需要一个2,所以状态就用三进制来表示。对于一个横着的矩形:1 1 10 0 0对于一个竖着的矩形:2 21 10 0当上一行的状态为0时,这一行才可以放新的矩形。实现时,可以在确定旧状态之后,搜索一个合法的新状态出来,这对于限制条件很多的时候很适用。代码#in...原创 2018-09-27 13:27:00 · 255 阅读 · 0 评论 -
bzoj1911 [Apio2010]特别行动队(斜率优化)
题目bzoj 1911 [Apio2010]特别行动队题解斜率优化DP设f[i]表示前i个士兵最大战斗力之和,有 去掉max,把仅与j有关的移到一边,另一边放与仅与i有关的或和i、j都有关的,得 根据上式,斜率为,决策点坐标为,截距为。因为要求截距...原创 2018-09-28 15:02:23 · 241 阅读 · 0 评论 -
bzoj1079 [SCOI2008]着色方案(计数类DP)
题目有n个木块排成一行,从左到右依次编号为1~n。你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块。所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n。相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案。(100%的数据满足:1 <= k <= 15, 1 <= ci <= 5)题解计数类DP看到ci如此小,...原创 2018-09-29 13:18:34 · 336 阅读 · 0 评论 -
洛谷3008 [USACO11JAN]道路与航线(Dijkstra)(拓扑序)
题目洛谷3008 [USACO11JAN]道路和飞机Roads and Planes题解Dijkstra+拓扑排序+乱搞省选题怎么可能考裸的SPFA?题目中有一句话改变了这题的最优解法:“如果有一条航线可以从A_i到B_i,那么保证不可能通过一些道路和航线从B_i回到A_i。”它不仅告诉我们没有负环,还说明可以用拓扑序,还说这张图就是几个大的用单向边连接的连通块。所以我们的决策...原创 2018-09-29 13:30:49 · 1158 阅读 · 3 评论 -
最短路径生成树—介绍
例题在顺利攻破Lord lsp的防线之后,lqr一行人来到了Lord lsp的城堡下方。Lord lsp黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商水平却没怎么增加。现在lqr已经搞清楚黑暗城堡有N个房间 (1≤N≤1000),M条可以制造的双向通道,以及每条通道的长度。lqr深知Lord lsp的想法,为了避免每次都要琢磨两个房间之间的最短路径,Lord lsp一定会把...原创 2018-09-30 14:40:18 · 2548 阅读 · 0 评论 -
poj2374 Fence Obstacle Course(DP)(线段树)
题目poj2374 Fence Obstacle Course题解线段树优化DP设f[i][0/1]表示在通过第i条栅栏后,处于栅栏左边/右边的最小路径长。因为奶牛是直线下来的,所以最优方案当然是从上一个栅栏的这个位置下来。由于有栅栏的影响,奶牛们不能顺利的下来,此时到达这个位置的最优策略要么是从前面那个栅栏的左端点过来,要么从右端点过来。所以有,。其中的j就是上一个挡住了这个位...原创 2018-10-03 16:46:49 · 417 阅读 · 0 评论 -
洛谷3629[APIO2010]巡逻(树的直径)
题目洛谷3629 [APIO2010]巡逻题解树的直径当k=0时,ans=2*(n-1)。当k=1时,显然连接树的直径两端是最优的。当连接两个点x,y时,x-y之间的路径就只被算了一次,ans=2(n-1)-l+1,其中l为树的直径。当k=2时,如果连接的部分没有关联,那ans=2(n-1)-l1+1-l2+1,其中l1,l2为树的直径。如果有相交部分,那么相交部分从原...原创 2018-10-03 21:54:11 · 339 阅读 · 0 评论 -
洛谷1099 & bzoj1999 树网的核(树的直径)(双指针)
题目洛谷1099 树网的核bzoj1999 树网的核(加强版)题解树的直径首先要发现一个结论:在任意一条树的直径上求最小偏心距是一样的!简单证明一下,自己yy吧~这样以后就可以乱搞了,O(N^3)暴力也可以过n=300的数据。直接上O(N)正正解!随便搞出一条直径来,这些点分别是a1,a2,…,at。在直径上一个点al,会有一个最大的ar,使得dist[ar]-dist[a...原创 2018-10-03 22:32:04 · 357 阅读 · 0 评论 -
洛谷2868 [USACO07DEC]观光奶牛Sightseeing Cows(0/1分数规划)(SPFA)
题目给定一张有向图,每个节点有一个权值fun[i],每条边有一个权值time[i]。求图中的一个环,使环上各点权值之和除以各边权值之和最大。题解0/1分数规划+spfa判负环把题意公式化,得到求最大,其中x[i]表示选或不选。设,那么有。假设我们要求到最大的这个分式值,相当于就是要求最大的L。可以证明这个分式值满足二分性,即L满足二分性。在二分时,如果有那么L可以有更大的...原创 2018-10-04 14:52:03 · 311 阅读 · 0 评论 -
洛谷1525 关押罪犯(并查集)(黑白染色)
题目洛谷1525关押罪犯题解1贪心+扩展域并查集把怨气值排序,大的当然要分配到两个不同的监狱。一个点拆成两个点,分两层,不同监狱连不同层。代码#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=20010,m...原创 2018-10-07 13:36:15 · 330 阅读 · 0 评论 -
poj3662 Telephone Lines(二分)(spfa)
题目poj3662 Telephone Lines题解二分+spfa判断一个问题如果满足二分性,整个问题就变得完全不一样了!显然,花的钱数满足二分性,问题就变成了判断是否存在一种免费方案,使得最大边权小于等于mid;或者说的直白一点,有没有一条路径,其上的边权大于mid的边的条数小于等于mid。这下,对于每个mid的,我们使所有原边权大于mid的现在为1,小于等于mid的现在为0...原创 2018-10-14 08:22:59 · 188 阅读 · 0 评论 -
poj1094 Sorting It All Out(传递闭包)
题目poj1094 Sorting It All Out题解Floyd解决 传递闭包若有A<B,那么连边(A,B,1),即d[A][B]=1。如果有A<B,且B<C,对应有d[A][B]=1,d[B][C]=1,在Floyd算法中,会使 d[A][C] |= d[A][B] & d[B][C] ,所以d[A][C]=1。这就是传递闭包。实现时,可以边输入...原创 2018-10-14 09:30:08 · 365 阅读 · 0 评论 -
poj2728 Desert King(0/1分数规划)(最小生成树)
题意每条边都有两个值ci、ri,选择一棵生成树,使这棵树上的最小。题解0/1分数规划+最小生成树判断老套路,把公式转变成,因为其符合生成树的定义,所以对其二分需要以生成树的形式。即以为边权,做一次最小生成树,如果存在大于等于0的答案,说明mid大了,还可以更小,r=mid;否则l=mid。总结和 洛谷2868 [USACO07DEC]观光奶牛Sightseeing ...原创 2018-10-14 10:33:39 · 398 阅读 · 0 评论 -
poj3417 Network(树上差分)
题意给出一棵树,再给出几条附加边,使得树存在环。求割掉一条主要边和一条附加边能让树不连通的方案数。题解lca+树上差分观察题目中附加边的特点,连接(x,y)的附加边使得(x,y)之间的连接方式又增加了1。不妨设一开始的连接方式为0。一条附加边可以使(x,y)之间的主要边的连接方式+1。如果割一条边被加到了2或以上,说明割掉这条主要边之后还得再割两条附加边,无法做到。如果只被加到...原创 2018-10-14 11:26:32 · 332 阅读 · 0 评论 -
CH#56C 异象石(LCA)(DFS序)
题目Adera是Microsoft应用商店中的一款解谜游戏。异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图。这张地图上有N个点,有N-1条双向边把它们连通起来。起初地图上没有任何异象石,在接下来的M个时刻中,每个时刻会发生以下三种类型的事件之一:1. 地图的某个点上出现了异象石(已经出现的不会再次出现);2. 地图某个点上的异象石被摧毁(不会摧毁没有异象石的点)...原创 2018-10-14 11:34:57 · 593 阅读 · 0 评论 -
poj3417 Network(tarjan)(lca)(并查集)
题意给出一个图,然后执行Q个操作,每次往里面添加一条边,并输出桥(割边)的数量。题解tarjan+lca+并查集(路径压缩)用tarjan很容易求出原图中所有的桥。考虑加边的情况。如果加在一个e-dcc中,不必理会。如果不是,那么从x到y一路上的桥都将消失。处理这个问题,只需要把(x,y)路径上所有边都枚举一下,如果bridge[i]==true,那么ans--。因为这段路上的...原创 2018-10-14 12:12:15 · 332 阅读 · 0 评论 -
poj1966 Network(最小割)
题意给定一张无向图,求去掉多少个点,可以使图不连通。题解最小割去掉一个点的代价为1,随便枚举两个点,就有了S和T,求最小割掉几个点使S和T不连通?看似很最小割模板,但是最小割割的是边啊!所以我们要进行点边转换。借用lyd一张图:把每个点拆成入点x和出点x’,先连一条(x,x',1)。对于原图中(x,y),按“出点连入点”的原则,(x',y,inf),(y',x,inf)...原创 2018-10-14 12:29:40 · 546 阅读 · 0 评论 -
洛谷1072 Hankson 的趣味题(素数)
题意求gcd(a0,x)=a1且lcm(b0,x)=b1中x的解的方案数。题解这种gcd的问题一般都要拆成质因数来分析。线筛出1~sqrt(2e9)中的素数,那么所有数的质因数一定在其中出现,不然它本身就是一个素数(这个要特判)。对于质数p,他们的次数分别为ca0,ca1,cb0,cb1。分析gcd的特点,因为gcd(a0,x)=a1,所以有min(ca0,x)=ca1。具体情况...原创 2018-10-15 19:28:52 · 273 阅读 · 0 评论 -
线筛素数进阶法
对于12,在传统线筛素数法中,会被2*6,3*4,两组重复否定为合数。我们可以规定每次只能让合数的质因数由大到小累计,如12=3*2*2,60=5*3*2*2。实现时,我们可以开一个v数组,v[x]记录x的最小质因数,x能借助的素数只有prime[1]~prime[k](prime[k]<=v[x])。在确定了为一方法枚举给个数后,这种方法就是O(N)了。 代码例题:洛谷3...原创 2018-08-24 08:52:39 · 270 阅读 · 0 评论 -
高斯消元—基本介绍
高斯消元其实就是暴力解多元一次方程,时间复杂度。按照一般的解方程方法,依次看每个未知数,找到一个包含它的系数非零的方程,用这个方程消掉这个未知数在其它方程中的存在,消元的原理是加减消元法。一般地,最后每个方程中只含有一个未知数,可以直接解得。特殊情况:无解:无解的方程如,即当一条方程中一个未知数也没有,但常数不为0时,方程无解。有无穷个解:有无穷个解的方程如,即对于未知数x,找不到一...原创 2018-08-29 20:51:32 · 465 阅读 · 0 评论 -
并查集—进阶
目录例题1题目题解例题2题目题解T1~2 Summarize例题3题目题解代码T1~2 Summarize例题4题目题解例题5题目题解代码例题6题目题解T4~6 Summarize例题1题目给一个无向图,求其中的连通块。题解并查集就是一个集合,并且以fa[x]为集合代表。对于这题,如果...原创 2018-09-09 15:40:55 · 1022 阅读 · 0 评论 -
poj2823 Sliding Window(单调队列)
题意给出一个长度为n的数列a[i],对于其中长度为k的子数列,输出其最小值和最大值。 题解单调队列队列存值和位置位置离i超过k的,出队对于最大值,用降序维护,每次放入一个值时一定要让数列顶的数大于它最小值反之 代码#include<cstdio>#include<cstring>#include<algorithm>u...原创 2018-08-10 20:41:11 · 163 阅读 · 0 评论 -
bzoj2351 [BeiJing2011]Matrix(二维hash)
题意给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过。 我的想法hash在不知道二维hash前,我想把一个二维矩阵转为一维的序列再hash。实现中却出现了除法,一想发现hash不能除。因为hash值本身就是模数,除法不满足同余定律。所以hash值只能通过加减乘来变化。代码放着,哪位神犇做出来了也告诉我一声。WA代码#i...原创 2018-08-13 10:58:56 · 303 阅读 · 0 评论 -
poj3076 Sudoku(DFS+剪枝)
题意用A~P填写一个16*16的数独。题解DFS+超强剪枝1、搜索每一个位置可以填的数,如果只有一个,立刻填上;如果没有可以填的数,立刻回溯。2、枚举一个数字,在每个行\列\宫格中,有没有可以填的地方。如果只有一个,将其填上;如果无法填上,立刻回溯。3、选取一个可能情况最少的格子,枚举其所有情况。4、dfs(k+1),重复执行以上操作。以上1和2的操作是有区别的:1只...原创 2018-08-22 20:10:17 · 1147 阅读 · 2 评论 -
CH2101 可达性统计(拓补排序)(递推)
题意给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。N,M≤30000。题解拓补排序设f[x]表示x节点能到达的点,用一个二进制为存储下来,1表示可达。f[x]&=f[ x所有能到达的点 ]。列出转移方程后,关键是要把顺序搞定。我们要先从子节点开始,再到父节点。这让我们想到了拓补排序,拓补排序能够保证我们在访问一个点之前,所有到它的节点都被访问...原创 2018-09-15 22:53:15 · 505 阅读 · 0 评论 -
CH2401 送礼物(双向搜索)
题目作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了。某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b),他一次可以搬动重量和在w(w<=2^31-1)以下的任意多个物品。GY希望一次搬掉尽量重的一些物品,请你告诉他在他的力气范围内一次性能搬动的最大重量是多少。题解双向搜索如果从一个方向搜索,会不断的产...原创 2018-09-15 22:57:21 · 562 阅读 · 0 评论 -
poj2248 Addition Chains(迭代加深)
题目poj2248 Addition Chains题解迭代加深当搜索树的分支随深度增大得很快的时候,最适合用迭代加深。设置一个dep限制搜索深度,一旦到达dep立刻回溯。dep逐渐增大,逼近答案。尽管每次都会重复搜索部分分支,因为最终的dep比较小,影响不大。这题正好符合迭代加深的要求:搜索树每个节点扩展的情况很多,且答案节点位置较浅。注意去除冗余状态,优先往大的X扩展。...原创 2018-09-15 22:59:53 · 1615 阅读 · 1 评论 -
hdu3085 Nightmare II(双向bfs)
题目hdu3085 Nightmare II题解双向bfs类似于双向dfs,当问题有明确的“初态”和“终态”时,便可以考虑。从两个状态分别开始,两边轮流进行,各扩展一整层。运用至该题,从初始状态开始,男孩走1秒,紧接着女孩走1秒。一旦在bfs中于某个点相聚,则男孩可以和女孩汇合。代码#include<cstdio>#include<cstring&...原创 2018-09-15 23:02:44 · 314 阅读 · 0 评论 -
poj3635 Full Tank(优先队列bfs)
题目poj3635 Full Tank题解优先队列bfs设置(x,h)表示到达城市x,还有h的油时的状态,并用d[x][h]记录油钱。bfs时有两个转移方向:(y,h-c),(y,h+1)。(其中y表示下一个点,c表示边权)因为涉及迭代,所以每个状态可能会被多次访问。因为我们用优先队列维护油钱递增,所以每个点第一次访问时一定是最少油钱到达这个点。 ...原创 2018-09-15 23:05:38 · 670 阅读 · 0 评论 -
poj2286 The Rotation Game(IDA*)
题目poj2286 The Rotation Game题解IDA*IDA*就是启发式迭代搜索。与A*相同,需要编写一个估价函数,满足f(x)<=g(x),其中f是估价函数,g是实际完成的代价。对于这题,我们以 中心区最小差多少个数字即可使中心8个数字一致 作为估价函数即可,因为每次操作至多使中心相同数字+1,能保证f[x]<=g[x]。接下来做一个迭代加深的搜索即可...原创 2018-09-15 23:14:59 · 300 阅读 · 0 评论 -
poj2083 Fractal(递归)
题目A fractal is an object or quantity that displays self-similarity, in a somewhat technical sense, on all scales. The object need not exhibit exactly the same structure at all scales, but the same "...原创 2018-08-01 19:41:41 · 766 阅读 · 0 评论 -
poj1050 To the Max(DP)
题意给一个n*n的矩阵,求最大子矩阵和。 我的想法这种子矩阵和的问题一般都是用个前缀和来求,一算复杂度O(n^4),一下子没了头绪。其实这题不用前缀和。 题解DP我们枚举st,ed两行,把其间的行全部压缩成一行,求以st和ed为两边的最大子矩阵和的问题,就转为求这个和数组的最大子串。求一个序列的最大子串和很简单,作为基础知识应该懂的。这样做的时间复杂度为O(n^...原创 2018-08-01 20:25:42 · 259 阅读 · 0 评论 -
poj1723 Soldiers(中位数)
题意给出n个点的坐标,它们只能往上、下、左、右一格一格地移动,求使其移动至水平线上的最小步数。 题解中位数先易后难,对于纵向的问题,我们推个公式,,这个很容易看出是货仓选址问题,k取y[i]的中位数就可以了。对于横向的问题,同样推一下公式,,推到这里,我们把与i相关的项全部合在了一起,只要把x[i]-i看作一个整体,这个子问题也是中位数问题。 代码#includ...原创 2018-08-02 19:28:02 · 847 阅读 · 0 评论