随笔分类 - 题解
摘要:"Luogu P1168" "Luogu P1801" "UVA 501(洛谷Remote Judge)" 前置知识:堆、优先队列STL的使用 对顶堆 是一种在线维护第$k$小的算法。 其实就是开两个堆,一个是大根堆,一个是小根堆。两个堆的根相对。 下面借助题目P1168进行详细分析。 P1168
阅读全文
摘要:"Luogu P3375" 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始进行匹配。 这种算法的时间复杂度几乎达到了$O(nm)$,显然是不能接受的。 这种做法的缺点在于
阅读全文
摘要:"Luogu P1967" 题目大意:给定一张图和q个询问,询问x节点和y节点的路径之间最小边权最大可以是多少。 可以发现对于一条边$E(x,y)$,如果x到y有另一条路径且最小边权大于$E(x,y)$,那么这条边完全可以不考虑了。 综上所述,我们可以考虑对这张图使用Kruskal构建最大生成树。
阅读全文
摘要:"Luogu P2515" 这道题的题面与P2146有点像。一些不同地方就是P2146是无环的,这题是有环的。 很显然,如果有几个软件的依赖关系形成环,那么这几个软件就可以被看成是一个大软件,其价值和空间都是原先的总和。 那么,我们就可以利用Tarjan算法求强连通分量+缩点,最后加一个树上的背包就
阅读全文
摘要:"Luogu P1892" "Luogu P2024" 这两道一眼看过去很容易发现可以用并查集来做——但是当我们仔细阅读题面后,会发现其实并没有那么简单。 我们知道并查集可以很轻松地维护具有传递性的信息,也就是“朋友的朋友就是我的朋友”这样的关系,但是普通的并查集并不能维护“敌人的敌人是朋友”这种关
阅读全文
摘要:"Luogu P3388" 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。 如果某个割点集合只含有一个顶点X(也即{X}是一个割点集合),那么X称为一个割点。 为了便于理解,我们可以从狭义上进行分析:对于一个连通无
阅读全文
摘要:"Luogu P2002" "Luogu P2341" 使用强连通分量算法缩点 第一题统计入度为0的个数强连通分量数。 第二题的答案为当且仅当仅有一个强连通分量的出度为0时该强连通分量的节点数,原因如下:若一个强连通分量出度为0,则说明这个强连通分量的喜爱无法对外传递;若有多个强连通分量出度为0,则
阅读全文
摘要:"Luogu P3387" 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图
阅读全文
摘要:"Luogu P1439" 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: 时空复杂度都为O(n^2^) 对于本题这种做法显然是无法接受的。 我们可以对这个题目进行转化。仔细看题,可以发现a,b两个序列都是1 n的排列。 那么,我们可以利用映射,将a中的数
阅读全文
摘要:"Luogu P4779" 利用堆/优先队列快速取得权值最小的点。 在稠密图中的表现比SPFA要优秀。
阅读全文
摘要:"Luogu P2146" 由于对于每一个软件包有且只有一个依赖的软件包,且依赖关系不存在环。 很显然这是一个树形的结构。 再看题目要求的操作,安装实际上对应的是覆盖根节点到当前节点的路径,卸载则是覆盖该节点的整颗子树。 对于这样的操作,树链剖分+线段树可以很轻松地维护。 值得注意的是,根节点编号为
阅读全文
摘要:树链剖分的基本思想是把一棵树剖分成若干条链,再利用线段树等数据结构维护相关数据,可以非常~~暴力~~优雅地解决很多问题。 树链剖分中的几个基本概念: 重儿子:对于当前节点的所有儿子中,子树大小最大的一个儿子就是重儿子(子树大小相同的则随意取一个) 轻儿子:不是重儿子就是轻儿子 重边:连接父节点和重儿
阅读全文
摘要:"Luogu P1972" 一开始非常naive随便打了个树状数组统计就交上去了,然后不出意料的爆零了…… 然后删一删改一改过了。 重点:对于区间[1,r]中重复出现的数,我们只需要关心最右边那一个是否在[l,r]中就可以了。 具体思路在代码注释中 cpp include include using
阅读全文
摘要:"Luogu P3379" 题意:对于两个节点,寻找他们的最近公共祖先。 一个显而易见的解法是对于每一个节点我们都往上遍历一遍,记录下它每一个祖先,然后再从另一个节点出发,一步一步往上走,找到以前记录过第一个节点就是这两个节点的LCA 事实上在这样的数据规模下,这种解法的时间复杂度是让人无法接受的。
阅读全文
摘要:"Luogu P1631" 题意很好懂,不作分析 很容易想出一个解法是求出每一个和,排序后取前n个。 当然这种做法妥妥的会MLE+TLE 我们会发现实质上这种做法的缺点在于存入了大量不需要的数据。 那么该怎么进行优化呢? 观察题目,易得下列关系 `a[1]+b[1] include include
阅读全文
摘要:"Luogu P1502" 题意很好理解,就是问给出的矩形套住的最大和。 但是做起来却十分麻烦。 ——来自疯狂爆10分的愤怒 一个比较高效的思路是——把每一个星星作为左下角向右上方拓展形成一个矩形, 拓展的规则为只要窗口的右上角在这个矩形之内,就可以覆盖到这个星星。然后用线段树维护一条扫描线从左往右
阅读全文
摘要:"Luogu P1714" 题目的大意就是给定一个长度为n的序列,求出这个序列中长度不超过m的子串的最大和 很容易想出的一个解法就是枚举起点终点,直接暴力扫一遍得出答案。 当然也很容易发现这种做法肯定会TLE。 也有一个很容易想到的优化方法——利用前缀和。 但是我们会发现即便如此,还是会TLE。 也
阅读全文
摘要:Luogu P1878 事实上这道题并不难,但我真没弄懂我手写堆为什么过不了。所以 STL大法好!!! 基本思路 对于每一对相邻异性,将他们的舞蹈技术的差插入一个堆 通过维护这个小根堆,每次就可以取得舞蹈技术差最小的一对 值得注意的是,每次取完一对舞伴之后,要对这对舞伴进行标记,并将堆中所有有这两位
阅读全文
摘要:Luogu P5490 作为一道模板题让我卡了一个月…… 对于线段树+离散化新手而言这实在是太难了…… 有关离散化: 可以查看这一篇文章:https://www.jianshu.com/p/9347659dcf18 一种缩小数据范围的小技巧,在本题中用于缩短线段树的区间大小 基本思路 想象一条直线,
阅读全文
摘要:点我进入原题Luogu P1981 【解题思路】 仔细分析题目,这就是一道模拟题…… 直接按照符号读入全部的数字,先算乘法,最后把全部数加起来就是结果了 记得要%10000取最后四位 【参考程序】
阅读全文

浙公网安备 33010602011771号