
算法笔记
,(逗号)
这个作者很懒,什么都没留下…
展开
-
结构体排序
1、优先队列优先队列的结构体排序:结构体内自排序、结构体外排序优先队列的比较符号刚好相反,“>”指从小到大排, "<"指从大到小排列注意两种写法的差别结构体外排序#include<queue>#include<iostream>#include<algorithm>using namespace std;struct Node{ string name; int age; Node(){} //Node(st原创 2021-02-25 19:37:44 · 650 阅读 · 0 评论 -
Splay
#include <iostream>#include <ctime>#include <cstdio>#include <cctype>const int maxn = 1e5+5;struct Node{ int l,r; int val,size; int cnt; //当前结点重复次数,默认为1}spl[maxn]; //内存池int cnt,root; //内存池计数器原创 2020-07-29 00:30:46 · 124 阅读 · 0 评论 -
AVL树
模板#include <iostream>#include <ctime>#include <cstdio>const int maxn = 1e5+5;struct Node{ int l,r; int val; int height,size;}avl[maxn]; //内存池,老生常谈int cnt,root;inline void newnode(int &now,int val) //新建结点原创 2020-07-28 15:31:48 · 118 阅读 · 0 评论 -
fhqTreap
// 用c++14 或 c++17提交#include <iostream>#include <ctime>#include <cstdio>#include <cctype>const int maxn = 1e5+5;struct Node{ int l,r; int val,key; int size;} fhq[maxn];int cnt,root;#include <random>std::m原创 2020-07-28 01:49:30 · 163 阅读 · 0 评论 -
替罪羊树
P3369 【模板】普通平衡树#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;#define read(x) scanf("%d",&x)#define MAXN 100005const double alpha=0.75;//这个值随心就好了struct node{ int ls,rs; int s原创 2020-07-27 19:35:00 · 130 阅读 · 0 评论 -
主席树求区间第K大
模板题#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int Max=2e5+10;long long a[Max],b[Max],cnt;int...原创 2020-04-13 21:14:16 · 186 阅读 · 0 评论 -
线段树
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int Max=1e5+10;long long tree[Max*4],flag[Max*4];void push_up(int root){...原创 2020-04-12 10:54:40 · 141 阅读 · 0 评论 -
字典树
模板int trie[Max][30],color[Max],cnt=1;void Insert(char *s){ int len=strlen(s); int now=0; for(int i=0;i<len;i++) { int ch=s[i]-'a'; if(!trie[now][ch]) { ...原创 2020-04-01 00:17:04 · 118 阅读 · 0 评论 -
求组合数C(n,m)的四种方法
方案一:纯暴力方案C(n,m)=n * (n-1) * (n-2) * (n-m+1) / m!typedef long long ll;ll Combination(ll n,ll m){ ll ans=1; for(int i=n;i>=n-m+1;i--) ans*=i; for(int i=m;i>=1;i--) ...转载 2020-03-30 19:02:53 · 4269 阅读 · 0 评论 -
大数运算的加减乘除
加int ans[Max]={5,4,3,2,1},sum[Max]={5,4,3,2,1};int len1=5,len2=5;void Add(int *ans,int *sum)// ans+sum{ int index1=0,index2=0,tmp=0; while(index1<len1||index2<len2) { tmp...原创 2020-03-30 12:42:23 · 235 阅读 · 0 评论 -
优先队列
//对于基础类型 默认是大顶堆priority_queue<int> a; //升序队列priority_queue <int,vector<int>,greater<int> > q;//降序队列priority_queue <int,vector<int>,less<int> >q;//greate...原创 2020-03-07 20:03:13 · 255 阅读 · 0 评论 -
网络流
Ford-Fulkerson运行时间很慢#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define mem(a,b) memset(a,b,sizeof(a)...原创 2020-02-20 18:08:13 · 121 阅读 · 0 评论 -
中国剩余定理
中国剩余定理是用于求一个最小的x,满足x≡ci(modmi)。正常的CRT有一个微小的要求,就是∀i,j(mi,mj)=1。在某些情况下,这个式子无法被满足,这个时候就要用扩展CRT来求解了。我们先假设我们只有两条方程要被求解,它们分别是:x≡c1(modm1)x≡c2(modm2)我们考虑将同余去掉,就变成了:x=c1+m1k1x=c2+m2k2联立一波,得:c1+m1k1=...原创 2019-10-19 21:32:54 · 593 阅读 · 0 评论 -
Fibonacci
裴波那契数列f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2] (i&amp;gt;=2)#include&amp;lt;stdio.h&amp;gt;int f(n){ if(n==0) return 0; if(n==1) return 1; return f(n-1)+f(n-2);}int main(){ int n; while(scanf(&quot;%d原创 2019-03-01 13:25:55 · 158 阅读 · 0 评论 -
母函数
对于序列a0,a1,a2,…构造一函数:G(x)=a0+a1x+a2x2+…称函数G(x)是序列a0,a1,a2,…的母函数概念说了也不懂…举例分析:例1:若有1克、2克、3克、4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案?如何解决这个问题呢?考虑构造母函数。我们假设x表示砝码,x的指数表示砝码的重量,则:1个1克的砝码可以用函数1+x表示,1个2克的砝码可以用函数1+...原创 2019-10-11 00:12:57 · 175 阅读 · 0 评论 -
求N^N的最高位
给你一个整数N,求N^N的最高位数字是多少比如:3^3=27,它的最高位是24^4=256,它的最高位是2;最先想到的是用快速乘求n^n的值,再求最高位,但太麻烦了我们知道A是整数部分,B是小数部分比如:求66的最高位log10(66)=6*log10(6)=log10(46656)=log10(k)≈4.6689075=A.B因为log10(k)=A.B; 46656=k=1...原创 2019-03-01 12:47:01 · 854 阅读 · 0 评论 -
全排列
参考链接//例:输入5#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <algorithm>#include<vector>#include<queue>#include<st...原创 2019-08-29 23:18:00 · 170 阅读 · 0 评论 -
最小生成树---Kruskal算法+Prim算法
学习最小生成树,要有并查集的基础。Kruskal算法以边为对象,按边从小到大排序。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <algorithm>#include<vector>#incl...原创 2019-08-29 13:47:29 · 140 阅读 · 0 评论 -
卡特兰数
char c[100][100]={ "1", "2", "5", "14", "42", "132", "429", "1430", "4862", "16796", "58786", "208012", "742900", "2674440", "9694845", ...原创 2019-08-17 22:08:27 · 313 阅读 · 0 评论 -
找素数(两种比较高效的方法)
质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。大于1的自然数若不是素数,则称之为合数。埃式筛法:所有的偶数(除2以外)都为合数,所有的奇数不一定为奇数①先把所有的除2以外的偶数都标记为0,所有的奇数都标记为1;0,1标记为0,2标记为1;②用for循环找出奇数中的非素数③奇数的...原创 2018-12-06 17:30:04 · 2286 阅读 · 0 评论 -
sort函数和qsort函数
1.使用sort函数必须用头文件#include < algorithm>和using namespace std;2.sort函数可以是三个参数也可以两个参数。3.(1)第一个参数表示所要排序的数组的起始地址(2) 第二个参数表示最后一位要排序的地址(3)第三个参数表示排序是从大到小(降序)还是从小到大(升序),如果不写第三个参数,则默认为从小到大排序。不带参数的情况#...原创 2018-12-05 18:09:40 · 318 阅读 · 0 评论 -
尺取
一:定义两个端点i,j, 初始化都从最左当开始;二:j向右移动,i保持不动;直到i与j之间数(包括i,j)的和>=m,记录此时的区间长度三:j停止移动,i向后移动,直至不满足条件(即i与j之间都和<m),记录i-1到j的区间长度。四:然后j继续向后移动,i不变,重复上述步骤,直至如果j点=移动到区间末尾i~j区间的和还不大于等于m,结束区间的枚举。五:可以用打擂台的方式找出...原创 2018-11-26 11:54:53 · 197 阅读 · 0 评论 -
前缀和
ans[ i ] = ans[ i - 1 ] + a[ i ];一般是利用数组前缀和求区间例:数组a[10]={0,1,2,3,4,5,6,7,8,9},那么利用前缀和求出来的数组为num[10]={0,1,3,6,10,15,21,28,36,45};如果要求a[4]到a[8]的和,就可以直接求num[8]-num[4-1]的值。例题:求1~10之间1出现的次数,就可以利用前缀和#i...原创 2018-11-22 23:53:46 · 1233 阅读 · 0 评论 -
串--manacher算法
建议大家去看这篇文章,写的非常详细下面是c版本的代码:#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int Max=1e4+10;char a[Max],b[Max];int halfle...转载 2019-07-25 15:21:55 · 78 阅读 · 0 评论 -
Flight spfa
题目 :hdu 3499这个题还是蛮坑人的。第一:用map来存字符串第二:dis数组一定会爆long long,INF一定要非常非常大,可以写成 #define INF 1LL << 60(太坑了)第三:这是一个有向图,方向是单向的(在这里卡了好多次)第四:目前对spfa理解还不够透彻,只会套模板,我的做法是根据模板改变,其他的方法(双向Dijkstra和走两遍spfa和sp...原创 2019-07-31 01:45:20 · 155 阅读 · 0 评论 -
串--ac自动机
推荐看这篇文章,好理解#include#include#include#include#includeusing namespace std;const int Max=1e5+10;int tire[Max][26];int fail[Max];int cntword[Max];int cnt=0;void insertword(char *word){i...原创 2019-07-25 19:48:44 · 115 阅读 · 0 评论 -
树状数组
这篇写的很详细HDU1166#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#include<cmath>#define mem(a,b) memset(a,b,sizeof(a))cons...转载 2019-08-02 17:54:23 · 144 阅读 · 0 评论 -
并查集
代码仅供参考,没有经过测验#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<map>#define mem(a,b) memset(...原创 2019-08-10 23:00:00 · 97 阅读 · 0 评论 -
线性筛素数+欧拉函数
欧拉函数定义 在数论中 ,对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目,记做phi(n)。如φ(8)=4,因为1,3,5,7均和8互质。性质 若n=(p1a1)(p2a2)……(pkak) (为N的分解式),则φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pk) 如果n为某一个素数p,则φ(p )=p-1 如果n为任意两个数a和b的积,那么φ(ab)=φ(a...原创 2019-08-14 23:57:40 · 199 阅读 · 0 评论 -
扩展欧几里得
扩展欧几里得算法详解对于一个方程a∗x+b∗y=gcd(a,b)来说,我们可以做如下的推导:设有a∗x1+b∗y1=gcd(a,b)a∗x1+b∗y1=gcd(a,b);同时我们有b∗x2+(a%b)∗y2=gcd(b,a%b)b∗x2+(a%b)∗y2=gcd(b,a%b);对于这个方程组,我们希望知道的是x1,x2,y1,y2x1,x2,y1,y2之间的关系,这样我们才可以递归解决这个...原创 2019-08-15 22:46:09 · 167 阅读 · 0 评论 -
KMP
void getnxt(){ nxt[0]=-1; int k=-1,j=0; while(j<x2) { if(k==-1||b[k]==b[j]) nxt[++j]=++k; else k=nxt[k]; }}int kmp(int s){ int i=s; int j...原创 2019-08-15 21:04:00 · 196 阅读 · 0 评论 -
Bellman-For
推荐看这篇文章Bellman-Ford算法可以判断负环,计算权值有负数的情况,SPFA算法只能判断负环,不能输出负圈。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue&...转载 2019-08-11 21:59:35 · 156 阅读 · 0 评论 -
Dijkstra+堆优化
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>#include <vector>#include <utility>using namespace std;#defi...原创 2019-08-11 20:42:56 · 179 阅读 · 0 评论 -
Dijkstra+普通版
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define mem(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3fconst int Max=1e3+10;using namespace st...原创 2019-08-11 18:17:26 · 145 阅读 · 0 评论 -
Floyd【多源最短路】
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#include<iostream>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;const int INF=0x3f3f...原创 2019-08-11 16:38:40 · 143 阅读 · 0 评论 -
SPFA【负环】
算法的理解(1)Dijkstra无法判断负环 我们要知道带有负环的图是没有最短路径的,所以我们在执行算法的时候,要判断图是否带有负环,方法有两种: 1.开始算法前,调用拓扑排序进行判断(一般不采用,浪费时间) 2.用SPFA,如果某个点进入队列的次数超过N次则存在负环(N为图的顶点数)SPFA算法 优点:可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径...原创 2019-08-11 13:08:15 · 345 阅读 · 0 评论