随笔分类 - 洛谷
摘要:一道鬼畜的题目,洛谷给的标签是紫题,怎么可能是紫题…… 原本我想找出在起点到终点的路径上的割点,但是看到了这良心的数据之后…… 由于数据很小,所以我们枚举中间点,然后进行一遍dfs,判断不经过这个中间点这张图是否联通即可。 这就能过?? 是的……时间复杂度为O(n2) 1 #include <ios
阅读全文
摘要:这是tarjan求割点的模板题,在此tarjan算法不在赘述,主要讲一些易错点。 首先这张图不一定是连通图,所以我们不能直接从1开始dfs 注意tarjan算法中的一些细节。 注意输出格式!!! 1 #include <iostream> 2 #include <cstdio> 3 #include
阅读全文
摘要:这是一道树链剖分/树上差分/LCA的题目…… 本来想打一遍树剖,但是被那强大的码量劝退了,于是我开始思考树上差分。 我们先把每个点深度的k次方打一个表,之后我们因为要做减法,所以我们令vali,k表示i到1号点路径上点深度的k次方之和 然后问题来了,我们维护的是点权和,所以我们发现直接减的话会导致
阅读全文
摘要:这道题说每一步可以走2k个距离,那么这道题就直接和倍增建立了联系。 由于n的范围很小,我们可以用Floyd处理边的关系,定义vis[i][j][k]表示ij之间是否存在2k的路径,dis[i][j]表示ij之间的最短距离是多少。 我们可以先进行一次Floyd处理vis,枚举ij以及中间点k,若vis
阅读全文
摘要:一道“扩展域”并查集的题目,我们把每一个点拆分成三个域:同类、食物、天敌。 我们假设x的同类域为x,食物域为x+n,天敌域为x+n+n。假设x与y是同类,那么说明x+n与y+n是同类,x+n+n与y+n+n是同类。 假设x吃y,那么x+n与y是同类,x+n+n与y+n是同类,x与y+n+n是同类。
阅读全文
摘要:这是一道带权并查集的题目。 我们维护三个数组,f[x]表示节点x所在集合的代表元素(相当于合并之后的树根),size[x]表示以x为代表元素的集合的大小是多少(相当于一列战舰的数量),d[x]表示在这一列战舰中,x前面的战舰有多少。 因此对于每一次询问,答案就是|d[x]-d[y]|-1. 我们怎样
阅读全文
摘要:读完题,我产生了一个显然的想法:先求出这张图的最大生成树,然后再dfs一遍求出联通块的个数(图可能不连通),之后这张图变成了一棵树,题目就变成了在一棵树上给定一条路径,求这条路径上最小的边权是多少。(-1的情况可以通过并查集直接判断)。 考虑一条路路径(x,y),我们可以把它拆分成(x,lca(x,
阅读全文
摘要:这是一道关于树的直径的好题,值得一刷。 本题有两个难点,一个是分类讨论k,另一个是代码的实现(其实还好)。 本题k可以为1或2,因此我们分类讨论一下。 当k=1时,我们可以任选两个点连接,假设我们一条边都不连接,那么我们需要走2*m次,其中m为边的数量。假设我们在x,y上连一条边,那么我们用1个距离
阅读全文
摘要:这是一道非常不错的题目,融合了多种算法。 首先这是一道单源最短路问题,一个显然的做法就是直接用相关的算法解决,但是本题有负权边,所以我们不能用dijstra算法,只能用spfa,但是如果数据是精心设计,那么spfa算法很可能被卡死,所以简单的单源最短路算法无法直接通过本题。 仔细分析,这道题有一个特
阅读全文
摘要:有关于最短路的题目。 我们先将将读入的原图存储下来,在存储一张原图的反向图,之后再进行一些操作。 我们在原图上求出一个数组d,其中d[i]表示从起点到i经过的点权最小的值,同理,我们在反向图上求出一个数组f,表示从终点到i经过的点权最大的值,这样一来,答案便是max(f[i]-d[i]). 我们在原
阅读全文
摘要:本人NOIP的考试题……也是我NOIP2018唯一爆零的题目,正因如此,本人无缘NOIP2018一等奖。 少年醒醒,都9012年了,还搞什么啊,赶紧想正解…… 本题的结构是一个树形的,因此我们可以用树形结构的相关知识解答。 本题的题目为“最小值最大”显然是二分答案的提示,因此我们二分答案最短的一条路
阅读全文
摘要:一道线型dp的题目 每一种卡片有一定的数量限制,也就是说在计算到某一个状态时应当知道每一个卡片能不能用,所以我们定义状态f[i][j][k][l]表示第一种卡片用i张,第二张卡片用j张……所得到的最大值。 对于每一个状态,考虑他是怎样转移的。若当前状态为f[i][j][k][l],那么当前的状态可以
阅读全文
摘要:一道入门的状压dp题,很有意思也很简单。 定义f[i][j]表示第i行的状态为j时,前i行的方案总数,那么答案ans=∑f[n][j]. 考虑状态的转移,第i-1行的状态k能转移到第i行的j,当且仅当j&k==0且j,k分别符合他们自己放在那一行的条件,所以f[i][j]=∑f[i-1][k] (条
阅读全文
摘要:树形dp可能是最优美的dp了…… 这是一道经典的树上背包问题,考虑两种做法。第一种是直接在树上做一遍背包问题,另一种是把这棵树转化成“左儿子右兄弟”的二叉树,再做一遍背包问题。 方法一:我们定义f[i][j]表示以i为根的子树,一共选j门课最大的分数,那么我们可以得到f[i][j]=max(f[i]
阅读全文
摘要:这道题当然可以用线段树求解,但是有点大材小用。我的做法是对顶堆,用两个堆维护中位数。 建立一个大根堆,一个小根堆。大根堆存储前半部分序列,小根堆存储后半部分序列,在任意时刻,这个序列的中位数为大根堆的堆顶或者是小根堆的堆顶。 如果现在新加入了一个数x,判断x应该在大根堆还是小根堆中,即判断排序后x在
阅读全文
摘要:区间动态规划的经典题,关于区间dp,状态定义是很显然的,定义f[i][j]表示把i~j这一区间合并花费的最小值,若i=j,则f[i][j]=0,若i≠j,则在i,j当中必定有一点k,使得i,j的区间先合并成i,k和k+1,j,然后合并成i,j.因此,对于每一对i,j,我们都枚举k,那么f[i][j]
阅读全文
摘要:显然,定义状态f[i][j][k][l]表示第一条路线走到(i,j),第二条走到(k,l)所取的数最大和。 状态转移方程即f[i][j][k][l]= max( max(f[i-1][j][k-1][l],f[i][j-1][k-1][l]), max(f[i-1][j][k][l-1],f[i][
阅读全文
摘要:这是一道基础数据结构的综合题,思考量较大,但是实现简单。 我们考虑建立三个队列,分别存储原始长度、切开后第一段的长度、第二段长度。显然,这三个队列是非严格单调下降的,对于每个时刻,将要切开的蚯蚓即为三个队列队头的最大值。另外,我们用一个变量delta表示整个集合的偏移值,即队列中的长度+delta=
阅读全文
摘要:本来想用双向广搜的,但是不太好保存路径,所以我就用的普通的bfs 思路很简单,从初始状态直接搜,每次扩展三个状态,用函数模拟一下三种变换,用map存储路径即可(拒绝康托展开,拒绝哈希,拒绝状压) 不得不说,对于数据不是很毒瘤的题,STL是真的好用啊…… 1 #include <iostream> 2
阅读全文
摘要:读完题,这是一道和bfs联通快有关的搜索题,肯定要搜索一些联通快,而这道题的难点在于如何判断当前的联通快属于山峰还是山谷。 因此,我们设计一个算法,在用bfs求联通快的同时,判断当前联通快是山峰山谷或者啥都不是。 具体地,我们像往常一样搜索联通快,若扩展的节点高度与当前联通快不同,则开始判断:如果大
阅读全文

浙公网安备 33010602011771号