摘要: #include <bits/stdc++.h> using namespace std; // 测试:https://www.luogu.com.cn/problem/P4779 /* 要求:求s到其他点的最短路径 1. dis[v] 表示s到v点的最短距离 2. 每次找出dis的最小值的点(堆优 阅读全文
posted @ 2024-05-14 13:43 lulaalu 阅读(42) 评论(0) 推荐(0)
摘要: 线段树 1、了解存储结构 存放左右范围,和左右子节点的预定义 #define lc p<<1 #define rc p<<1|1 struct node { int l, r, sum; }tr[4 * N];//注意要开4倍,感兴趣自己搜 2、递归建树 思路 对结点的左右范围赋值 判断是不是叶子结 阅读全文
posted @ 2024-05-09 16:52 lulaalu 阅读(24) 评论(0) 推荐(0)
摘要: Floyd 首先,对该算法有一个大致的了解: 通过动态规划的方式,按顺序对每两个点之间的最短距离进行处理 而这个顺序用一句话总结就是 :依次将每个点作为"中间点"做更新 1、存储 邻接矩阵存储 用两个数组存储信息 一个存储两点长度 一个存储路径Path 其中,D(-1)表示初始状态,相当于邻接矩阵, 阅读全文
posted @ 2024-04-27 22:16 lulaalu 阅读(43) 评论(0) 推荐(0)
摘要: Kruskal 算法 edge存储边起点、终点、边权 fa[x]存储x的父节点 1、先初始化父节点 2、按边的权排序(贪心思想) 3、如果不在同一集合内,把这条边加入最小生成树,并且合并两个集合,反之就跳过 4、最后根据连接的点是否是顶点的个数减一确定能否生成最小生成树 如下图,红色表示取的边和次序 阅读全文
posted @ 2024-04-13 10:32 lulaalu 阅读(29) 评论(0) 推荐(0)
摘要: 合并石子问题 https://www.luogu.com.cn/problem/P1880 [NOI1995] 石子合并 题目大致描述 \(N\)堆石子摆成了一个圆,每相邻的两堆合成一堆,新的一堆的石子数为得分,求得分最小和最多 \(1\leq N\leq 100\),\(0\leq a_i\leq 阅读全文
posted @ 2024-04-12 20:35 lulaalu 阅读(37) 评论(0) 推荐(0)
摘要: Manacher(马拉车算法) P3805 模板manacher 算法 1、写出暴力方法 先处理字符串,用#分隔,头为都要有 用一个r数组存储每个点的最长子串的半径 枚举每个点然后向外扩张 扩张完毕后自减 表示半径 获取最大值 暴力法如下 string deal(string& str) { str 阅读全文
posted @ 2024-04-10 18:31 lulaalu 阅读(21) 评论(0) 推荐(0)