摘要: 图的存储 注:代码均为对向图处理 1.直接存边 用于对边的预处理,不过多赘述 2.邻接矩阵 使用一个二维数组\(g[u][v]\) 表示\(u\) 点是否连接着\(v\) 点。 存储: for(int i = 1; i <= m; i++){ int u, v; cin >> u >> v; a[u 阅读全文
posted @ 2026-05-30 14:35 HEGVDV 阅读(13) 评论(0) 推荐(0)
摘要: 背包DP 0/1背包 有\(n\)件物品,第i件物品的重量为\(w[i]\),价值为\(v[i]\),有一个承重上限为\(t\)的包,在不超出承重的情况下,装的物品价值总和最大为多少? 代码 for (int i=1; i<=n; i++) { for (int j=1; j<=t; j++) { 阅读全文
posted @ 2026-05-30 11:16 HEGVDV 阅读(11) 评论(0) 推荐(0)
摘要: 动态规划基本 动态规划需满足的前提条件 1. 重叠子问题 子问题是原大问题的小版本,计算步骤完全一样;其次,计算大问题时,需要多次重复计算小问题。(可有可无) 2.最优子结构 大问题包含小问题的最优解,可以通过小问题计算出大问题。 3.无后效性 由小问题计算出的大问题不会影响已经算过的小问题的结果( 阅读全文
posted @ 2026-05-30 11:15 HEGVDV 阅读(13) 评论(0) 推荐(0)
摘要: 组合数学 基础 排列组合 定义:排列是从给定元素中取出指定个数的元素进行排序;组合是在排列的基础上不考虑排序。 加法原理 鸽 乘法原理 鸽 排列与组合基础 排列数 从 \(n\) 个不同的数中,选择 \(m\) 个\((m\leq n,m和n均为自然数,下同)\) 数排成一列的排列方式的个数叫做排列 阅读全文
posted @ 2026-04-18 17:16 HEGVDV 阅读(13) 评论(0) 推荐(0)
摘要: 堆,可持久化线段树 I.堆 堆是一颗完全二叉树 堆顶一定是堆中所有元素最大或最小的(对于优先级而言) 实现堆 应该不会有人手写堆吧 用STL的优先队列 定义一个优先队列: 首先你需要一个头文件:#include<queue> priority_queue<int> q;//这是一个大根堆q prio 阅读全文
posted @ 2025-04-05 10:36 HEGVDV 阅读(44) 评论(0) 推荐(0)
摘要: 单调栈,单调队列,树状数组,线段树 I.单调栈 要了解单调栈,首先,我们得了解栈。 栈是一种数据结构,表现为数据“先进先出”。 而单调栈则是栈中所有数据单调递增或单调递减。 如何维护单调栈 我们以维护一个单调递减的单调栈为例: 假设有以下数据 3 7 4 12 2 对于第一个元素,因为栈中没有元素, 阅读全文
posted @ 2025-04-04 14:41 HEGVDV 阅读(39) 评论(0) 推荐(0)
摘要: 字符串处理 I.KMP KMP主要应用于字符串匹配问题 KMP相比普通的单模式串匹配的优势在于:对于每次失配,我们不会从头开始,而是从特定的位置开始匹配。 考虑一组样例 模式串 :abcab 文本串 :abcacababcab 首先,前四位按位匹配成功,遇到第五位不同。而这时,我们选择将abcab向 阅读全文
posted @ 2025-04-02 21:14 HEGVDV 阅读(62) 评论(0) 推荐(0)
摘要: 进阶图论 I. 割点与桥 首先,我们得了解割点的含义 割点 对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点(又称割顶)。 通俗点说,就是连接两个或多个连通分量的公共点。 如何求割点呢,这里引用一个算法:Ttarjan 定义 dfn[i] 为 i 点DFS访 阅读全文
posted @ 2025-04-01 20:51 HEGVDV 阅读(67) 评论(0) 推荐(0)
摘要: 三分,哈希, 模拟退火 I .三分 三分,顾名思义, 将一个区间分成三段(需要平均分), 以类似二分的处理方式判断答案在那个区间。 接着继续枚举, 直到确定结果。 三分一样需要单调性, 但单调性与二分有所不同。 二分需要满足数据严格“ 递增 ”或“ 递减 ”。而三分只需要满足数据是一个单峰或单谷函数 阅读全文
posted @ 2025-03-29 21:22 HEGVDV 阅读(97) 评论(0) 推荐(0)