Algorithm
文章平均质量分 54
面向对象面向君,不负代码不负卿
CodeEcho
不负代码不负卿
展开
-
【Algorithm】搜索与图论
树与图的遍历拓扑排序最短路DijkstraBellman-FordSPFAFloyd最小生成树PrimKruskal原创 2022-04-22 10:21:03 · 106 阅读 · 0 评论 -
【Algorithm】天梯赛题目合集
天梯赛合集原创 2022-03-21 20:28:02 · 372 阅读 · 0 评论 -
【Algorithm】扩展欧几里得算法
若 a,b 是整数,且 gcd(a, b) = d,那么对于任意的 x,y,a * x + b * y 一定是 d 的倍数,特别地,一定存在整数 x,y 使得 a * x + b* y = d。线性同余方程因为 a∗x ≡ b(mod m) 等价于 a∗x−b 是 m 的倍数,因此线性同余方程等价为a∗x+m∗y = b根据裴蜀定理,上述等式有解当且仅当 gcd(a,m) | b因此先用扩展欧几里得算法求出一组整数 x0x_0x0,y_0, 使得 a∗x0x_0x0+m∗y0y_0y0 =原创 2022-06-30 14:14:55 · 128 阅读 · 0 评论 -
【Algorithm】逆元
当 p 是质数时,可以利用快速幂求逆元。a / b ≡ a * x (mod n)两边同乘 b 可得 a ≡ a * b * x (mod n)即 1 ≡ b * x (mod n)同 b * x ≡ 1 (mod n)由费马小定理可知,当n为质数时bn−1b^{n - 1}bn−1 ≡ 1 (mod n)拆一个 b 出来可得 b * bn−2b^{n - 2}bn−2 ≡ 1 (mod n)故当n为质数时,b的乘法逆元 x = bn−2b^{n - 2}bn−2扩展欧几里得算法求逆元当原创 2022-06-30 13:42:44 · 245 阅读 · 0 评论 -
【Algorithm】欧拉函数
可通过容斥原理证明上述 ϕ(N)\phi{(N)}ϕ(N)tip: 当 m,n 互质时,ϕ(m∗n)\phi(m * n)ϕ(m∗n) = ϕ(m)\phi(m)ϕ(m) * ϕ(n)\phi(n)ϕ(n)质数 i 的欧拉函数 phi[i] = i - 1 :1 ~ i - 1 均与 i 互质;i * primes[j] (合数) 时,.........原创 2022-06-28 20:18:04 · 146 阅读 · 0 评论 -
【Algorithm】质数
若一个正整数无法被除了 1 和它自身之外的任何自然数整除,则称该数为自然数(或素数),否则称该正整数为合数。在整个自然数集合中,质数的数量不多,分布比较稀疏,对于一个足够大的整数 N,不超过 N 的质数大约有 N / lnN 个,即每 lnN 个数中大约有一个质数。(然而,我不知道有什么用,至今没碰到过应用QwQ)试除法分解质因数朴素筛法求素数线性筛法求素数合数只会被它的最小质因子筛掉...原创 2022-06-27 20:42:25 · 143 阅读 · 0 评论 -
【Algorithm】约数
约数个数和约数之和正整数 N 能够被唯一分解为 约数个数:约数之和: 约数之和: k 较小,但是 B 是5e7,遍历等比数组求和会超时。可以分治来做:例如,求 即 sum(p, k)通用求等比数列和的方法欧几里得算法 -- 最大公约数...原创 2022-06-27 18:08:48 · 198 阅读 · 0 评论 -
【Algorithm】GPLT L3-020 至多删三个字符
表示前 个字符删掉 个字符结果有 个。这样会有重复的。例如一个字符串 abcdefdxyz,删除 def 和删除 efd 后得到的字符串都是abcdxyz。这时候就要去重了,根据上面那个例子,可以发现对于一个字符 s[ i ],如果在 i 之前存在一个 last,使得 s[ last ] = s[ i ],那么删除 [ last, i - 1 ] 间的字符和删除 [ last + 1, i ] 间的字符其实是重复的。那么 dp[ i ][ j ] 就要减去这个重复,这个重复可表示为 dp[ last原创 2022-06-23 15:02:02 · 253 阅读 · 0 评论 -
【Algorithm】GPLT L2-013 红色警报
用图的深度优先遍历计算图内的连通分量有多少个,记为num。之后对于每一次输入数据,因为城市 x 被攻占,所以把 x 的所有路径标注为不可达(即 0 ),再统计连通分量的个数 t ,如果 t > cnt + 1,也就是说当现在的连通分量多余以前的连通分量 +1 的时候,说明改变了图的连通性;(因为城市被攻占本身它城市自己就变成了一个单独的城市,多出来一个连通分量),每一次 t 在用完之后把 num 的值更新为 t ,保证下一次的判断是建立再已经失去之前这么多城市的基础之上的。因为题目中说输入保证给出的被攻占的原创 2022-06-16 16:41:48 · 177 阅读 · 0 评论 -
【Algorithm】GPLT L2-014 列车调度
活用 STL必须要车号大的先出,小的后出。所以列车排队的每一队必须是从大到小排列(从右往左看),才能保证开出去的车也是从大到小的。对于每一个想要进入并列铁轨的车:(1)如果车号大于每一队的队尾的车号,说明不能进入已经有的队伍,必须进入新的铁轨。(2)否则,选择一个最接近它车号的尾部车号的队伍进入其实无需保存每一个并行队列的所有值,只需要保存当前队伍的车尾(就是每一列最左边 即 每一列的最小值)即可。因为每一次都是需要排序比较大小的,所以用 set 自动排序。每一次 set 的最后一个值 st.rbegin(原创 2022-06-16 14:49:04 · 225 阅读 · 0 评论 -
【Algorithm】GPLT L2-007 家庭房产
两个结构体数组,一个用来接收数据,另一个用来输出答案。用 Union 函数来合并。由于要输出家庭成员的最小编号,所以,家庭成员的最小编号便作为这个家庭集合的标志,p[find(a)] = find(b) ( find(a) > find(b))。vis 数组用来标记所有出现过的人。people 来统计家庭人数。标记flag ,true 的数量,就是家庭的数量。......原创 2022-06-14 17:05:01 · 317 阅读 · 0 评论 -
【Algorithm】最长上升子序列 II
这题看似是动态规划问题,但注意其数据范围。最长上升子序列动态规划做法的时间复杂度是,此题数据范围较大,必超时。首先,求最长上升子序列的问题和它的子问题有这样的依赖关系:上图这样就可以求得序列 3 1 2 1 8 5 6 的 LIS 长度是 4 ,把 6 接在 1 2 5 后面即可。所以,要求串 a[0...i] 的 LIS ,就要知道:串 a[0...i-1] 中各长度的上升子序列末尾元素的最小值。 后者可以用一个 q 数组来存储,q[i] 是所有长度为 i 的上升子序列末尾元素的最小值。这个数组是严格单原创 2022-06-10 17:49:04 · 378 阅读 · 0 评论 -
【Algorithm】区间问题
区间选点 最大不相交区间数量 区间分组 区间覆盖原创 2022-06-07 12:09:38 · 309 阅读 · 0 评论 -
【Algorithm】2021 RoboCom 世界机器人开发者大赛-本科组(初赛)
给定n个数,再给定k组数,要求判断每一组内的任意一个数,是否存在n个数内任取四个数的平均值等于它本身。四层循环去枚举取数的过程。由于下标会出现小数,所有用 map 来存。为了避免精度问题,bool 数组下标存下四个数之和而不是平均值,最后判断每一组数的四倍是否在 bool 数组内。 芬兰木棋 (25分) 如果要获得最大分数,那可以把所有木棋都击倒,最大分数就是所有木棋得分之和为了尽量减少击打次数,那么需要把同一方向的得分为 1 的连续的木棋一次性击倒,其余的木棋都是一个木棋击打一次。同一方向可以原创 2022-07-07 11:20:31 · 263 阅读 · 0 评论 -
【Algorithm】GPLT L2-038 病毒溯源
L2-038 病毒溯源v[ i ] 中保存第 i 种病毒可能产生的变异病毒编号,in[ i ] 中保存编号 i 的入度,入度为零的病毒为源头病毒,pre[ i ] 中保存病毒由哪种病毒变异而来(上级病毒)。为了保证序列最小,在输入 v[ i ]后可对其进行一次排序,然后通过 BFS 找到变异次数,过程中由 res 和 idx 标记最多变异次数量以及对应的病毒编号,最后通过pre找回完整变异链。#include <iostream>#include <algorithm.原创 2022-04-22 20:22:17 · 531 阅读 · 0 评论 -
【Algorithm】GPLT L2-039 清点代码库
L2-039 清点代码库将每一个功能模块用vector<int>存储,并将其储存在map容器内。最后将数量与模块输出储存在可以有多个相同key值的multimap容器内。因为按照升序输出,所以添加一个容器参数greater<int>。这样一来multimap容器内就是排好序的答案啦,然后直接输出答案即可。set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列 size() empty() clea...原创 2022-04-22 17:35:43 · 2148 阅读 · 1 评论 -
【Algorithm】GPLT L2-012 关于堆的判断
L2-012 关于堆的判断必须注意,因为题目要求按照插入的顺序建立,所以是边插入边调整的,必须用向上调整,每次输入一个数之后就将它向上调整。两者建立出来的二叉树不同,而不能采用先转换为二叉树的方式再向下调整。这里的输入很巧妙~#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 1010;int n, m;原创 2022-04-22 13:42:33 · 1425 阅读 · 0 评论 -
【Algorithm】Kruskal
Kruskal算法时间复杂度是 O(mlogm), n 表示点数,m表示边数int n, m; // n是点数,m是边数int p[N]; // 并查集的父节点数组struct Edge // 存储边{ int a, b, w; bool operator< (const Edge &W)const { return w < W.w; }}edges[M];int find...原创 2022-04-22 10:13:53 · 218 阅读 · 0 评论 -
【Algorithm】Prim
朴素版prim算法时间复杂度是 O(n^2+m), n 表示点数,m表示边数int n; // n表示点数int g[N][N]; // 邻接矩阵,存储所有边int dist[N]; // 存储其他点到当前最小生成树的距离bool st[N]; // 存储每个点是否已经在生成树中// 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和int prim(){ memset(dist,...原创 2022-04-22 09:44:06 · 568 阅读 · 0 评论 -
【Algorithm】Bellman-Ford
Bellman-Ford算法时间复杂度 O(nm), n 表示点数,m表示边数注意在模板题中需要对下面的模板稍作修改,加上备份数组,详情见模板题。int n, m; // n表示点数,m表示边数int dist[N]; // dist[x]存储1到x的最短路距离struct Edge // 边,a表示出点,b表示入点,w表示边的权重{ int a, b, w;}edges[M];// 求1到n的最短路距离,如果无法从1走到n,则返回-1。.原创 2022-04-21 19:40:46 · 98 阅读 · 0 评论 -
【Algorithm】Dijkstra
朴素dijkstra算法 堆优化版dijkstra原创 2022-04-21 18:42:14 · 143 阅读 · 0 评论 -
【Algorithm】拓扑排序
有向无环图 -- 拓扑图拓扑序不唯一有向图的拓扑序列惊!数组模拟队列居然还有这种存储作用#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 1e5 + 10;int n, m;int h[N], e[N], ne[N], idx, d[N], q[N];int add(int a, int b){.原创 2022-04-21 15:50:45 · 149 阅读 · 0 评论 -
【Algorithm】树与图的遍历
树与图的存储 树与图的遍历深度优先遍历 宽度优先遍历原创 2022-04-21 14:43:14 · 828 阅读 · 0 评论 -
【Algorithm】哈希表
一般哈希:拉链法 开放寻址法 字符串哈希原创 2022-04-20 19:10:00 · 175 阅读 · 0 评论 -
【Algorithm】堆
手写堆 堆排序 模拟堆原创 2022-04-19 20:51:21 · 83 阅读 · 0 评论 -
【Algorithm】并查集
朴素并查集 维护size的并查集 维护到祖宗节点距离的并查集 食物链原创 2022-04-19 16:48:26 · 110 阅读 · 0 评论 -
【Algorithm】Trie树
Tire 树:高效地存储和查询字符串集合的数据结构 最大异或对原创 2022-04-18 16:30:57 · 694 阅读 · 0 评论 -
【Algorithm】KMP
KMP -- 字符串的匹配问题给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 PP 在模式串 SS 中所有出现的位置的起始下标。暴力:只要枚举文本串的起始位置 i,然后从该位开始逐位与模式串进行匹配,如果匹配过程中每一位都相同,则匹配成功;否则,只要出现某位不同,就让文本串的起始位置变为 i + 1,并且从头开始模式串的匹配。这种做法的时间复杂度为 O(n * m)。for (int i = 1;原创 2022-04-17 21:29:15 · 303 阅读 · 0 评论 -
【Algorithm】链表
单链表 双链表原创 2022-04-17 15:12:26 · 766 阅读 · 0 评论 -
【Algorithm】离散化
离散化 区间和原创 2022-04-15 15:42:35 · 184 阅读 · 0 评论 -
【Algorithm】双指针
最长连续不重复子序列 数组元素的目标和 判断子序列原创 2022-04-14 16:23:31 · 256 阅读 · 0 评论 -
【Algorithm】前缀和与差分
一维前缀和 二维前缀和 一维差分 二维差分原创 2022-04-13 17:17:02 · 170 阅读 · 0 评论 -
【Algorithm】高精度
高精度加法 高精度减法 高精度乘法 高精度除法原创 2022-04-12 16:21:17 · 144 阅读 · 0 评论 -
【Algorithm】二分
整数二分 浮点数二分原创 2022-04-11 11:36:27 · 283 阅读 · 0 评论 -
【Algorithm】GPLT L2-022 重排链表
L2-022 重排链表ProblemSolution最初的想法:初始链表,12345…n,重排后 n1(n-1)2(n-2)3…,不能够局限于链表重排的实现,链表是及其麻烦的,我们用结构体模拟链表。开了一个结构数组进行输入,下标是地址,还包括数据域,和下一个地址。在开另外两个结构数组,来记录123 … n/2 和 n(n-1)(n-2) … ceil(n/2.0),其中,记录第二个结构数组时,采用倒叙记录,方便和第一个下边保持一致。结果:测试点 3 没过,查阅资料才知道,是输入的时候原创 2022-03-27 10:19:45 · 2026 阅读 · 0 评论 -
【Algorithm】GPTL L1-046 整除光棍
L1-046 整除光棍ProblemSolution经尝试,逐渐增加光棍的位数确实会有超时。然后看了网上的一些解法,才知道还有这种操作:模拟竖式除法。和普通的竖式除法不同的是,它要在余数后面加上一,这样除出来的结果才相当于是在被除数后面加了一。以求13对应的光棍数为例,得先找到一个比13大的数,然后做这样的除法,算出来一位输出一位,如下图:Code#include <iostream>using namespace std;int main() { in原创 2022-03-26 20:50:07 · 468 阅读 · 0 评论 -
【Algorithm】动态规划(背包)
一、装箱问题 二、01 背包 三、完全背包原创 2022-03-24 18:20:03 · 1696 阅读 · 0 评论 -
【Algorithm】动态规划(线性)
一、数字三角形 二、过河卒 三、传球游戏 四、最长不下降子序列(LIS) 五、滑雪 六、最大连续子序列和 七、最长公共子序列(LCS)原创 2022-03-23 19:37:40 · 1199 阅读 · 0 评论 -
【Algorithm】GPLT L1-050 倒数第N个字符串
L1-050 倒数第N个字符串ProblemSolution总共有个字符串,倒数第 n 个,就是第- n + 1 个。由于输出的时 'a' + x ,我们从 0 开始编号,也就是第- n 个。类似于10进制转26进制。Code#include <bits/stdc++.h>using namespace std;#define int long longint l, n, t;char a[10];signed main(){ ...原创 2022-03-21 20:15:04 · 163 阅读 · 2 评论 -
【Algorithm】GPLT L1-006 连续因子
L1-006 连续因子ProblemSolution如果 n 为质数,输出 1 和 本身。记录连续因子序列的左右端点,如果序列左右端点之差大于之前存的,更新数据。有个测试点弄了很久,把 r 的初值改为 -1 就过了,如果 l,r 的初值都为 0,r - l + 1 为 1。n = 2 时,会出错。因为 n 的最小连续子序列为 2。Code#include <bits/stdc++.h>using namespace std;#define int long l.原创 2022-03-20 19:54:39 · 159 阅读 · 0 评论