- 博客(142)
- 收藏
- 关注

原创 【刷题】数据结构——STL【模板】
文章目录1 二元组:pair2 变长数组:vector3 字符串:string4 队列:4.1 queue 普通队列4.2 priority_queue 优先队列4.3 deque 双端队列5 栈:stack6 红黑树(平衡二叉树):6.1 set6.2 map6.3 multiset6.4 multimap7 哈希表:7.1 unordered_set7.2 unordered_map7.3 unordered_multiset7.4 unordered_multimap8 压位:bitset1 二元组
2022-02-04 00:31:49
1505
1

原创 【刷题】算法基础刷题清单
录 一、动态规划 1、线性DP 2、背包问题 3、状态机模型 4、状态压缩DP 5、区间DP 6、树形DP 7、数位DP 二、搜索
2021-12-13 14:56:57
3398
原创 【刷题】图论——最小生成树:局域网
要想去除边,并且不改变连通性,而且去除的值最大,相当于保留最小生成树。注意这题连通块有若干个,所以运行Kruskal相当于。
2024-04-12 22:26:35
414
原创 【刷题】图论——最小生成树:Prim、Kruskal【模板】
适用于邻接矩阵存的稠密图,n个点m条边,时间复杂度是。Prim:每次选择当前点所在。
2024-04-12 21:39:56
1344
原创 【刷题】数据结构——树状数组:楼兰图腾
想要快速求出一个区间有多少个数,每出现一个数在相应位置+1,然后用前缀和即可。初始集合为空,从左往右扫描一遍,对于每个位置i,求出当前集合有多少数大于yi,即区间[yi+1, n]有多少个数,然后将yi加入集合中;二维坐标轴上有n个点,横坐标分别为1~n,需要找出所有满足高低高和低高低的三元组,求这些三元组的数量。低高低同理,求多少个数小于yi,换成区间[0, yi-1],也就是sum(yi-1)即可。初始集合为空,再从右往左扫描一遍,求出当前集合有多少数大于yi,然后将yi加入集合中。
2024-03-31 21:37:26
391
原创 【刷题】搜索——BFS:八数码【A*模板】
fuguhug(u):起点到u走的距离h(u):u到终点估计的距离,保证0≤hu≤h′u。其中h’(u)是真实距离和普通BFS不同,A*算法用的是优先队列,根据f从小到大排序(小根堆)。拓展点时只有g(u)变小才进队,终点出队时停止。
2023-04-20 20:38:25
505
原创 【刷题】搜索——BFS:字串变换【双向广搜模板】
双向广搜是BFS的一种优化方式,就是起点和终点同时往中间搜索。假设每搜一步,都会有6种新的状态进入队列,搜索10步才能得到答案,总状态数是166263...69。但是假如已知终点的状态,起点终点同时搜索,则只要各搜索5步,总状态数是2∗16626364具体实现时,可以开两个队列,分别存起点和终点搜索的状态,挑两者状态数更少的那个队列进行更新。
2023-04-18 11:20:16
479
原创 【刷题】搜索——BFS:抓住那头牛
由于两种移动方式移动都只花费相同时间,所以从起点开始bfs,枚举两种方式走法加到队列里即可。的右侧时,必然要往左走,不可能先往右再往左,而k最大是1e5,农夫至多在2e5的位置。注意移动范围并不在1e5内,例如牛在100000处,农夫在50001处,则最优解是。
2023-02-21 00:01:15
220
原创 【刷题】搜索——BFS:迷宫问题【最短路模型模板】
tips:要想打印起点到终点的路径,可以从终点向起点搜索,这样pre数组记录的方向就是起点向终点。记录路径可用一个pre数组,新节点进队时记录该节点的pre节点是队头元素。由于bfs的特性,从起点开始搜索时,一旦搜到终点,就是最短路径。
2023-02-20 20:43:38
255
原创 【刷题】搜索——BFS:城堡问题(The Castle)【Flood Fill、并查集】
找出房间个数——>求连通块个数最大房间——>求最大连通块直接用flood fill算法注意题目的输入,例如11821,则代表有西、北、南墙。
2023-02-14 00:40:18
289
原创 【刷题】搜索——BFS:池塘计数【Flood Fill模板】
常用于在线性时间内寻找连通块。大致思想如下:在一大块土地上,有若干高地(灰色的格子),现在往土地上的某个格子倒洪水,水只会在低处蔓延(白色格子),无法覆盖高地。水在每一个时间单位只会向周围(上下左右,左上、左下、右上、右下)蔓延一格。时间1:时间2:时间3:每个时间单位,相当于宽搜的一层搜索。一开始队列里只有开始倒水的格子,然后将周围格子加到队列,再将把新加进来格子周围的格子加进队列。当没有新格子进来时,这部分就是连通块。注意覆盖后要对格子进行标记,防止重复覆盖。
2023-02-13 16:14:24
245
原创 【刷题】数学知识——博弈论:移棋子游戏
移棋子游戏该游戏是一个有向图游戏,每个棋子都是互相独立的,所以可以看成K个相同的棋盘,每个棋盘上有1个棋子。这样问题就转化成K个有向图游戏,求有向图游戏的和即可。即每个棋子的SG函数互相异或是否为0。注意实际遍历时只要求一张图的SG函数值,由于是有向无环图而不是树,可能有多个起点,每个起点都要进行一遍搜索。...
2022-07-13 00:27:43
863
原创 【刷题】数学知识——博弈论:NIM游戏
博弈论的游戏主要分为:公平组合游戏:游戏有两个人参与,二者轮流做出决策,双方均知道游戏的完整信息;任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束。非公平组合游戏在非公平组合游戏中,游戏者在某一确定状态可以做出的决策集合与游戏者有关。大部分的棋类游戏都不是公平组合游戏,如国际象棋、中国象棋、围棋、五子棋等(因为双方都不能使用对方的棋子)。反常游戏胜者为第一个无法行动的玩家
2022-07-11 23:55:46
2409
原创 【刷题】数学知识——容斥原理:能被整除的数
集合SSS由三个互相重叠的集合S1,S2,S3S_1,S_2,S_3S1,S2,S3组成,则S=∣S1∣+∣S2∣+∣S3∣−∣S1∩S2∣−∣S1∩S3∣−∣S2∩S3∣+∣S1∩S2∩S3∣S=|S_1|+|S_2|+|S_3|-|S_1\cap S_2|-|S_1\cap S_3| - |S_2\cap S_3| +|S_1\cap S_2\cap S_3|S=∣S1∣+∣S2∣+∣S3∣−∣S1∩S2∣−∣S1∩S3∣−∣S2∩S3∣+∣S1∩S2∩S3∣这是因为当某
2022-07-08 22:42:34
226
原创 【刷题】数学知识——欧拉函数
欧拉函数ϕ(n)\phi(n)ϕ(n):表示1~n中与n互质的数的个数例如ϕ(6)=2\phi(6)=2ϕ(6)=2,因为1 2 3 4 5 6中只有1和5跟6互质。求ϕ(n)\phi(n)ϕ(n)方法如下:当n=p1a1∗p2a2∗...∗pkakn=p_1^{a_1}*p_2^{a_2}*...*p_k^{a_k}n=p1a1∗p2a2∗...∗pkak时,其中ppp均为质数ϕ(n)=n∗(1−1/p1)∗(1−1/p2)∗...∗(1−1/pk)\phi(n)=n*(1-1/p_1
2022-05-30 22:02:06
525
原创 【刷题】数学知识——约数:最大公约数【辗转相除/欧几里得算法】
根据常识我们知道,如果ddd能整除aaa,ddd也能整数bbb,显然ddd能整除ax+byax+byax+by,其中xxx和yyy是整数。即若d∣ad|ad∣a且d∣bd|bd∣b , 则d∣(ax+by)d|(ax+by)d∣(ax+by)而a%ba\%ba%b可以写成a−⌊a/b⌋∗b=a−c∗ba-\lfloor a/b \rfloor * b=a-c*ba−⌊a/b⌋∗b=a−c∗b,所以ddd能整除a%ba\%ba%b下面证明 aaa、bbb的最大公约数 等于 bbb、a%ba\%ba%b.
2022-05-16 18:14:27
210
原创 【刷题】数学知识——约数:求约数之和
假设一个数n可以拆成n=p1a1∗p2a2∗...∗pkakn=p_1^{a_1} * p_2^{a_2} *...*p_k^{a_k}n=p1a1∗p2a2∗...∗pkak,其中p是质数,如36=22∗3236=2^2*3^236=22∗32,那么约数的和就是(p10+p11+...+p1a1)∗(p20+p21+...+p2a2)∗...∗(pk0+pk1+...+pkak)(p_1^0+p_1^1+...+p_1^{a_1})*(p_2^0+p_2^1+...+p_2^{a_2}).
2022-05-16 17:43:33
1582
原创 【刷题】数学知识——约数:求约数个数
假设一个数n可以拆成n=p1a1∗p2a2∗...∗pkakn=p_1^{a_1} * p_2^{a_2} *...*p_k^{a_k}n=p1a1∗p2a2∗...∗pkak,其中p是质数,如36=22∗3236=2^2*3^236=22∗32,那么约数的个数就有(a1+1)∗(a2+1)∗...∗(ak+1)(a_1+1)*(a_2+1)*...*(a_k+1)(a1+1)∗(a2+1)∗...∗(ak+1)个,如36的约数个数就有(2+1)∗(2+1)=9(2+1)*(2+1.
2022-05-13 23:52:31
557
原创 【刷题】数学知识——约数:试除法求约数
约数是成对出现的,如6=2*3,知道小的约数2同时也能知道大的约数3,那么枚举时只需要枚举到n\sqrt nn即可。#include <iostream>#include <algorithm>#include <vector>using namespace std;int n;vector<int> get_divisors(int a) { vector<int> res; for (int i = 1; i *.
2022-05-13 22:48:41
226
原创 【刷题】贪心——Huffman树:合并果子
基本概念路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。下图中,从根结点到结点 a 之间的通路就是一条路径。路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。下图从根结点到结点 c 的路径长度为 3。结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。下图中结点a的权是1。结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。下图中结
2022-02-25 22:57:54
540
原创 【刷题】基础算法——基数排序【模板】
以一个数为基数 bbb,然后第 kkk 次按照在 bbb 进制下的第 kkk 位来排序。例如有121212 个数:13 23 34 27 19 37 43 22 11 9 21 40取 b=10b=10b=10,也就是十进制。当 k=1k=1k=1 时,排序结果如下:40 11 21 22 13 23 43 34 27 37 19 9现在这些数已经按照个位排好序了,接下来,当 k=2k=2k=2时,排序结果如下:9 11 13 19 21 22 23 27 34 37 40 43这时候,由于
2022-02-25 22:47:32
620
原创 【刷题】贪心——区间问题:区间覆盖
文章目录模型算法正确性代码实现模型给定N个闭区间[ai,bi][a_i, b_i][ai,bi]以及一个线段[s,t][s,t][s,t],选择尽量少的区间,将线段完全覆盖。第一行输入整数s和t,代表线段两个端点第二行输入整数N,表示区间数接下来N行输入整数ai,bia_i, b_iai,bi,表示区间两个端点输出一个整数,表示最少区间数如果无解则输出-1数据范围:1≤N≤1051 \leq N \leq 10^51≤N≤105−109≤ai≤bi≤109-10^9 \leq
2022-02-24 00:23:25
1057
原创 【刷题】贪心——区间问题:区间分组
文章目录模型算法正确性代码实现模型给定N个闭区间[ai,bi][a_i, b_i][ai,bi],将区间分成若干组,使每组内的区间两两(包括端点)没有交集。求组数的最小值。输入N,表示区间数接下去N行,每行包括 a i , b i a_i, b_i ai,bi,表示一个区间的两个端点。1≤N≤1051≤N≤1051≤N≤105−109≤ai≤bi≤109-10^9\leq a_i \leq b_i \leq 10^9−109≤ai≤bi≤109输出组数的最小值算法将区间按左端
2022-02-23 22:06:48
694
原创 【刷题】贪心——区间问题:最大不相交区间
给定N个闭区间[ai,bi][a_i, b_i][ai,bi],在数轴上选若干区间,使得选中的区间之间互不相交(包括端点)。求可选取区间的最大数量输入N表示区间数接下去N行,每行包括ai,bia_i, b_iai,bi,表示一个区间的两个端点。1≤N≤1051\leq N \leq 10^51≤N≤105−109≤ai≤bi≤109-10^9\leq a_i \leq b_i \leq 10^9−109≤ai≤bi≤109算法:将区间按右端点从小到大排序,依次枚举每个区间。如果
2022-02-23 20:53:42
806
原创 【刷题】贪心——区间问题:区间选点
数轴上有n个闭区间[ai,bi][a_i,b_i][ai,bi]。选择尽量少的点,使得每个区间内都至少有一个选择的点。算法:将区间按右端点从小到大排序,依次枚举每个区间。如果区间包含点:跳过如果区间不包含点:将点放在区间右端点。正确性:设算法得到的点的个数是A,最优解得到点的个数是BA≥BA \geq BA≥B:因为每个区间都包含点,因此A是合法解,最优解显然不超过合法解。B≥AB \geq AB≥A:按照算法选出来的放点的区间,一定是两两没有交集的,否则这个区间会包含上个区间放
2022-02-23 20:10:14
449
原创 【刷题】动态规划——线性DP:编辑距离
设f[i,j]f[i, j]f[i,j]:将a[1,2,...,i]a[1,2,...,i]a[1,2,...,i]变成b[1,2,...,j]b[1,2,...,j]b[1,2,...,j]的操作的最小数。删a[i]a[i]a[i]:f[i, j] = f[i - 1, j] + 1需要a[1,2,...,i−1]a[1,2,...,i-1]a[1,2,...,i−1]和b[1,2,...,j]b[1,2,...,j]b[1,2,...,j]相同,这样删除a[i]a[i]a[i]后aaa和bbb相.
2022-02-10 02:12:25
787
原创 【刷题】图论——最小生成树:Kruskal【模板】
算法步骤将所有边按边权从小到大排序 O(mlogm)O(mlogm)O(mlogm)枚举每条无向边(u, v) O(m)O(m)O(m)如果u和v不连通,将这条边加入集合中算法实现题目链接#include <iostream>#include <algorithm>using namespace std;const int N = 10005, M = 500005, INF = 0x3f3f3f3f;int n, m, p[N];struct
2022-02-08 00:37:17
820
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人