随笔分类 - 基础模板
摘要:3. 区间合并 原理:区间排序左端点有交集的区间可以合并 struct OI{int l, r;}num[N]; inline int cmp(OI a, OI b){return a.l < b.l;} //按照左端点排序 sort(num+1, num+1+n,cmp); void combin
阅读全文
摘要:拉链法 #include <iostream> #include <cstring> using namespace std; //空间(数组长度)最好是质数,离2的整数次幂尽可能的远(减少冲突) const int N = 1e6 + 3; int e[N], ne[N], h[N],n, idx
阅读全文
摘要:#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 8, M = 1e6 + 2; char p[N], s[M]; int n, m, ne[M]; int main(){ // p --> 模板串 s --> 模式串
阅读全文
摘要:单链表 int head, e[N], ne[N], idx; // 0 号点 e[0] 指针 ne[0] = 1; head --> 头结点下标 // e[i] --> 表示节点 i的值 // ne[i] --> 表示节点 i 的next指针 // idx --> 存储当前用到的地址,相当于指针,
阅读全文
摘要:朴素Dijkstra //Dijkstra算法,用于单源最短路边都为正数的情况 int n, m; int dis[N], g[N][N]; //dis -> 最短距离 g -> 图 bool st[N]; int Dijkstra(){ memset(dis, 0x3f, sizeof(dis))
阅读全文
摘要:手写小根堆:堆一般就是完全二叉树,满足父节点小于等于子节点(大根堆相反) 数组存储堆: 1.父亲节点为 x ,则左右儿子节点分别为 2x , 2x + 1 2.插入一个数: head[++size] = x ; up(size); 3.求集合中最小值: head[1]; 4.删除最小值: head[
阅读全文
摘要:例题 例题 例题 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中 现在我们假定 fa[i] 表示第 i 个人的老大是谁 现在我们有甲,乙,丙三个人(分别用 a, b, c
阅读全文
摘要:栈: 队列 单链表 双链表 1.栈 #include <bits/stdc++.h> using namespace std; const innt N = 1e6 + 10; //栈 stk -->数组模拟栈 tt--> 栈顶 int stk[N], tt ; //进栈 void push(int
阅读全文
摘要:字典树存储字符串,查找方便,迅速; 基本思想就是建立一棵树,每一层都有26个节点(对应26个字母),如果这个字符没有的话就占位,有就通过这个节点向下一层建树 即一个字符串,每个字母对应每一层,对应的层数里面有这个字母就下一层没有就建节点 Trie树例题 #include <iostream> #in
阅读全文
摘要:水 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 1e4 + 9; int n ; struct node{ int data; // 数值 int rank
阅读全文
摘要:水 //fib高精度用二维数组存 #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using namespace std; int n,len=1,f[5003][5003]; //f[k][i] -
阅读全文
摘要:前缀和: 一维: #define N 10004 void _1(){ int n, a[N], ans[N]; scanf("%d",&n); for(int i = 1; i <= n; i++){scanf("%d",a+i);ans[i] += ans[i-1] + a[i] ;} // f
阅读全文
摘要:模板: bool check(int x) {/* ... */} // 检查x是否满足某种性质 // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用: int bsearch_1(int l, int r) { while (l < r){ int mid = l + r
阅读全文
摘要:1.归并 2.快排 1.归并排序 归并排序将一组数分成两部分,从这两部分选最小的数到另外的数组中 如:6 2 4 3 5 1 分后: 6 2 4->...->2 4 6 3 5 1->...->1 3 5 接着分别取1 2 3 4 5 6放到另外的数组中 归并排序时间复杂度O(nlogn)最坏情况下
阅读全文