![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 69
Asuka_46_
这个作者很懒,什么都没留下…
展开
-
动态规划 DP专题
动态规划原创 2022-11-28 20:41:24 · 388 阅读 · 1 评论 -
莫队(模板 + 带简单修改的莫队)
莫队算法原创 2021-09-23 21:35:57 · 278 阅读 · 0 评论 -
FFT 快速傅里叶变换 && NTT 快速数论变换
FFT && NTT原创 2022-10-18 19:08:03 · 511 阅读 · 1 评论 -
Miller_Rabin质数判定 & Pollard_rho质因数分解 【POJ1811】 (2022CCPC网络赛H)
Miller_Rabin质数判定Pollard_rho质因数分解原创 2022-10-13 19:14:15 · 133 阅读 · 0 评论 -
线段树【2021东北四省D(HDU7116)Lowbit】【2021杭电多校8/HDU7059 Counting Stars】
题目链接题意:两种操作,一是对某个区间上的数每个数和加上他的lowbit,二是查询区间和分析:首先,很容易想到这题估计得用树状数组,线段树之类的数据结构解决,但问题是修改有点麻烦,对一个区间上加的数不统一,难以快速维护。解决问题需要对lowbit比较熟悉,很容易发现,在加lowbit的情况下,所有数在加了一定次之后都会变成10000…000(2)这样的数,那之后在加lowbit实际是对它乘2了。所以,这道题,如果一个区间上的数都是100000(2)形式的就乘2,并且lazy标记即可,否则暴力维护。原创 2021-09-05 16:39:30 · 361 阅读 · 0 评论 -
AC自动机
AC自动机原创 2021-09-01 21:53:25 · 287 阅读 · 1 评论 -
树形dp 入门模板题
树形dp• 树型dp一般先算子树然后进行合并,在实现上与树的后序遍历(这个说法并不准确,因为其实很多都不是二叉树)类似——遍历子树,遍历完之后把子树的值合并给父亲。• 大部分的树形dp都是利用递归,先确定叶子结点的特征,然后推上去,即状态转移方程一般都是有该点的某些特征 = 其子节点的一些特征• 有的树形dp以哪个点为根节点无所谓,有的有所谓。引入• 给你一棵n个点的树(1号点为根节点),求以点i为根的子树的大小• f[i]以点i为根的子树的点的个数• f[i] = 1+Σf[k] (k是i的原创 2021-05-20 19:36:11 · 876 阅读 · 1 评论 -
区间dp 入门模板题
poj2955题意:求最长的”正则括号“的长度,正则括号定义如下:1.空串是正则括号2.如果s是正则括号,则(s)和[s]也是3.如果a和b都是正则括号,则ab也是4.第四条没看懂,(正则序列可以是原来序列的子序列(我自己胡乱说的))分析:区间dp,区间长度从1枚举到最长.(dp[i][j]表示i~j这个串中正则序列最长的长度)如果区间端点处两个字符匹配,那么dp[i][j] = dp[i+1][j-1] + 2,然后再更新这个区间的值,枚举这个区间的间断点k,dp[i][j]的值与左半区原创 2021-05-12 17:46:43 · 205 阅读 · 0 评论 -
【模板】矩阵快速幂
矩阵快速幂用途: 用于求很长的递推(例如,fibo第1e18项这种)难点在于推出需要做快速幂的矩阵代码的话,难点在于矩阵的乘法快速幂部分跟普通数字求快速幂相差不大,换个变量而已。矩阵乘法代码实现1.写函数,传参计算。struct Matrix{ ll ma[105][105];}a, b;Mat multi(Mat a, Mat b){ Mat res; memset(res.ma, 0, sizeof(res.ma)); for(int i = 1;原创 2021-05-07 19:22:34 · 311 阅读 · 0 评论 -
主席树 洛谷3834&POJ2104&HDU 6278
主席树原创 2021-05-04 11:14:39 · 154 阅读 · 0 评论 -
trie树(前缀树,字典树) 入门模板题 (不使用指针,acmer写法)
trie树又称单词查找树,字典树,前缀树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。个人觉得关键是搞明白数组tree[root][id]的意思。(假设用于存仅含小写字母的单词)若tree[root][id] == 0,表示root这个点没有与表示字符id + 'a'的点相连.若tree[root][id原创 2021-04-21 21:18:37 · 376 阅读 · 0 评论 -
离散化 + 并查集 I - Invoking the Magic Gym - 102770I
unique函数需要认识一个新的函数:unique函数unique函数可以删除有序数组中的重复元素。注意:a 这里的删除不是真的delete,而是将重复的元素放到容器末尾b unique函数的返回值是去重之后的尾地址c 一定要先对数组进行排序才可以使用unique函数unique(s, s + tot)与大多数函数一样,两个参数是数组的地址,前闭后开,返回值是迭代器。另一道离散化题I - Invoking the Magic Gym - 102770I分析:读完题应该可以想到并查原创 2021-04-20 20:09:35 · 201 阅读 · 0 评论 -
矩阵压缩,旋转矩阵
最强对手矩阵题意:给你一个n * m的矩阵,让你求出最大子矩阵分析:首先,一般会想到二维前缀和,但是即使构造出二维前缀和,如果还只是枚举矩阵的左上和右下顶点的还是会T,需要想办法优化。可以考虑降维。矩阵压缩:如果是一维的,那就是求最大子串和,我们想办法转化为求最大子串和,由此我们枚举行,我们把所枚举的行看成是一个串求最大字串和即可。旋转矩阵这样做的时间复杂度是 O(mn^2),而观察道这个题数据范围是nm <=2e5,为了让mn^2的值尽可能的小,我们考虑旋转矩阵,让n(行数)小。原创 2021-04-12 21:26:25 · 342 阅读 · 0 评论 -
很透彻的KMP算法
KMP以字符串从下标0为前提next数组next[i]:当模式串T中的第i个字符失配时,应该用T串中第next[i]个字符去与主串的那个字符匹配。next[i]的计算:其值等于串s[0…i-1]的所有不包括自己的所有前缀子串和后缀子串中,相等且最长的长度。特别的next[0] = -1eg. 求串ababab的next值 next[0] = -1; next[1] = 0; next[2]:s[0...1] = "ab", 不包括自己的所有前缀子串和后缀子串前缀 后缀a b没有原创 2021-04-07 21:47:55 · 226 阅读 · 2 评论 -
字符串hash(赖皮算法) M形字符串
字符串hash• Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过哈希算法,变换成固定长度的输出,该输出就是哈希值。• 哈希值的空间通常远小于输入的空间,不同的输入可能会哈希成相同的输出,所以不可能从哈希值来确定唯一的输入值。• 字符串hash —— 把一个字符串变成一个数字(一般是小于int的)说人话就是把一个字符串对应成一个数字,如果两个字符串相等那么它们对应的数字一定相等,对应的数字相等这两个字符串不一定相等,但是,原创 2021-03-31 20:43:52 · 251 阅读 · 0 评论 -
带权并查集 POJ1988 Cube Stacking
• 有n个从1到n编号的箱子,将每个箱子当做一个栈,对这些箱子进行p次操作,每次操作分别为以下两种之一:• 1、输入 M x y:表示将编号为x的箱子所在的栈放在编号为y的箱子所在栈的栈顶.• 2、输入 C x:计算编号为x的所表示的栈中在x号箱子下面的箱子数目.分析:普通的并查集只会连条边,我们需要有边权的并查集,我们除了维护fa[i]数组以外,还需要维护两个数组,第一个是sum[i],代表i所在的集合的元素个数(i为根节点的话),另外根节点和父节点是不一样滴!!!第二个数组是ar[i],代表点原创 2021-03-09 21:24:16 · 180 阅读 · 1 评论 -
图论——最小生成树(prim算法和Kruskal算法)模板
洛谷 P3366 【模板】最小生成树Kruskal算法(贪心思想)使用Kruskal算法求最小生成树时,建图用的edge数组中存三个量,x,y,len,代表x和y之间有一条长度为len的边算法过程:1.把这m条边以边长从小到大排序2.每次取最小的那条边,判断这条边相连的两个点是否已经在树上了(利用并查集),如果没在加上这条边,把这两个点加到树上去(合并两个点)。AC代码:#include <bits/stdc++.h>using namespace std;struct原创 2021-03-09 18:58:55 · 208 阅读 · 2 评论 -
拓扑排序
John有n个任务要做,每个任务在做之前要先做特定的一些任务。输入第一行包含两个整数n和m,其中1<=n<=100。 n表示任务数,而m表示有m条任务之间的关系。 接下来有m行,每行包含两个整数i和j,表示任务i要在j之前做。当读入两个0(i=0,j=0)时,输入结束。输出包含q行,每行输出一条可行的安排方案。...原创 2021-03-08 19:19:20 · 296 阅读 · 0 评论 -
manacher算法
manacher算法参考博客:1.https://www.cnblogs.com/cloudplankroader/p/10988844.html2.https://blog.csdn.net/xingyeyongheng/article/details/93105551.首先讲最普通的遍历,从0 ~ len,以每一个字符为中心,向左右开始遍历,判断这两个字符是否相等,这种遍历有个缺点就是对于偶数长度字符串无法处理,从上面的描述中可以看出找到的回文子串的长度也一定是奇数。时间复杂度是O(n^2)原创 2021-03-01 15:52:22 · 104 阅读 · 0 评论 -
分治求 二维平面内最近两个点的距离
在平面内有两个点找出最近的两个点。分析:如果我们将平面一份为二,那么这个答案可能来自三种情况。1.这两个点在左半平面。2.这两个点在右半平面。3.这两个点横跨左右平面分割线。那么我们需要先把第一二种情况下得到的答案求出(假设为d),而这个问题就是原来问题的一个子问题,可以使用递归求解。然后再处理离分割线左侧d和离右侧d的所有点,将这些点按y坐标排序,从第一个开始遍历(两层循环),每次判断两点的纵距离是否大于d,是则break;另外,平面一份为二,尽量均匀分布,所以可以先以x坐标排序,然后注意递原创 2021-02-21 22:37:29 · 1684 阅读 · 1 评论 -
归并排序(求逆序对),快速排序(求序列第k小的数,最大子串和)
归并:区间一分二,将两个子区间排序,合并 o(nlogn)快排:选一基准,将小于基准的放左边,大于放右边,然后。。时间复杂度nlogn~n^2归并模板//归并#include <bits/stdc++.h>using namespace std;int a[100], b[100];//原数组a,数组b用于暂存排好序的原数组void _merge(int l, int mid, int r)//合并{ int p1 = l, p2 = mid + 1;//两个指针原创 2021-02-19 00:50:17 · 274 阅读 · 0 评论 -
博弈论入门
一.巴士博弈(Bash Game)eg1.拿石头,一共有n个石头Alice和Bob每人每回合可以拿1~m - 1个石头最后一个拿石头的人获胜。n =1 / 2 / 3 先手胜4 后手胜5 / 6 / 7 先手胜8 后手胜9 / 10 / 11 先手n % m == 0 后手胜 n % m != 0 先手胜例题:HDU1846#include <bits/stdc++.h>using namespace std;int c, n, m;int main(){原创 2021-01-31 19:32:21 · 563 阅读 · 0 评论 -
动态规划——最长上升子序列,最长公共子序列,最大子串和
最长上升子序列LISdp[i]记录以ar[i]结尾的最长上升子序列的长度初始化:dp[0] = 0,dp[i] = 1;状态转移方程: if(ar[i] > ar[j]) dp[i] = max(dp[i], dp[j] + 1); ans = max(ans, dp[i]);#include <bits/stdc++.h>using namespace std;int n;int ar[100050];int dp[100050];int main(){原创 2021-01-29 21:20:54 · 155 阅读 · 0 评论 -
单调队列(滑动窗口)
单调队列 滑动窗口#include <bits/stdc++.h>using namespace std;int ar[1000005];int q[1000005];int n, k;int main(){ scanf("%d %d", &n, &k); for(int i = 0; i < n; ++i) scanf("%d", &ar[i]); int hh = 0, tt = -1; for(in原创 2020-12-07 20:16:20 · 167 阅读 · 0 评论 -
动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包
动态规划dp:01背包,完全背包,分组背包,多重背包一. 01背包问题描述:给定n个物体(它们的重量为:w1,w2,…,wn,价值为:v1,v2,…,vn) 和 一个承受重量为W的背包,问怎么选取这些物体,放在背包中(不超过背包的承重),让所取的子集达到最大价值。思路分析找子问题,像下面这个栗子4种物品:(1) 3克 4元 (2)4克 6元(3)7克 10元 (4) 2克 3元背包: 11克这个问题相当于先找出只有前三个物品的情况下的背包最大价值,再判断选第四个物品和不选第原创 2020-12-03 23:49:38 · 754 阅读 · 1 评论