ACWinng 学习跟踪笔记
打卡学习ACWing
氯的平方
大一新生,写点东西抗遗忘
展开
-
L2-035 完全二叉树的层序遍历
#include <iostream>#include <algorithm>using namespace std;const int Maxn = 2e5 + 10;int n;int tree[Maxn]; // 数组模拟好处就是顺序输出数组即为BFS顺序void Create(int t) { // 后序遍历输入数据到树里面即可 if(t > n) { return ; } else { Crea原创 2021-04-22 16:37:51 · 164 阅读 · 0 评论 -
根据前序遍历结果和中序遍历结果建立二叉树
#include <iostream> #include <algorithm> #include <queue>#include <set>using namespace std;const int Maxn = 100;typedef struct Node { int data = 0; struct Node *Left_node = NULL; struct Node *Right_node = NULL;原创 2021-04-22 14:53:06 · 103 阅读 · 0 评论 -
树状DFS理解
题目:题目可以将DFS的每一次进层都想象为树的向下走一层,退层则也是树中的该节点顺着路径向上倒着走一步,主要需要深入思考的是,树的向下走代表什么,向上走代表什么。 这个方法最好的地方在于可以快速确定如何将最后一层得出的结果,一起返回到递归的外面,只要将每一层的DFS都写在(传递)回推墙里面,则一但在某一个节点确定了正确,就可以沿着树的这条路径一直向上倒退至树顶。代码:#include <iostream>#include <algorithm>using namespa原创 2020-12-14 21:11:00 · 207 阅读 · 0 评论 -
二维费用的背包问题(DP中 01 背包的变形版本)
题目:二维费用的背包问题#include <iostream>#include <algorithm>#define LL long long using namespace std;const int Max = 1e3 + 50;int v[Max],m[Max],w[Max],f[Max][Max],N,M,V;int main(void){ ios::sync_with_stdio(false); cin.tie(0),cout原创 2020-12-12 22:47:38 · 155 阅读 · 0 评论 -
线段树 (区间和 + 单点操作)
#include <set>#include <map>#include <queue>#include <stack>#include <cmath>#include <vector>#include <string>#include <cstring>#include <iostream>#include <algorithm>#define FAST ios::原创 2020-12-06 21:49:57 · 92 阅读 · 0 评论 -
GCD + 素数筛实现
题目:GCD问题题目首先考虑最坏的情况,在这N个数字当中,先选出所有的素数 和1 组成最坏集合,这些由素数构成的集合中的任选两个数字的GCD结果都是1,再向这个集合中加入一个其他的数字,则一定会导致存在两个数字其GCD的结果大于1 (抽屉原理?)(但是要注意,当n小于4的时候,1,2,3全部都可以当作素数,则无法向其中再添加数字了)代码:#include <set>#include <map>#include <queue>#include <stac原创 2020-12-06 15:58:53 · 142 阅读 · 0 评论 -
黑白边 + 克鲁斯卡尔算法
Acwing学习的时候没有给出KrusKal算法的板子,这道题刚好遇到了(Prim算法也可以 ,其实就是没有想到怎么做)克鲁斯卡尔算法伪代码模板:(并查集实现)读入所有的边 将边按照权值进行排序 从权值小的开始,依次将边的两个端点加入并查集中(前提是这两个端点不再同一个并查集里面),最后判断是否存在最小生成树的时候,判断cnt是否等于顶点数n即可。黑色边题目:黑白边题目#include <set>#include <map>#include <queue>原创 2020-12-06 15:30:34 · 183 阅读 · 0 评论 -
N皇后问题
#include <set>#include <map>#include <queue>#include <stack>#include <string>#include <cstring>#include <iostream>#include <algorithm>#define FAST ios::sync_with_stdio(false)#define LL long longus原创 2020-12-03 13:44:57 · 89 阅读 · 0 评论 -
拓扑排序 + 链式前项星 (教材版本实现)
#include <iostream>#include <algorithm>#include <queue>#include <set>#include <string>#include <cstring>#include <map>#include <stack>#define FAST ios::sync_with_stdio(false)#define LL long longus原创 2020-12-02 17:11:27 · 105 阅读 · 0 评论 -
使用链式前项星实现BFS
依旧是对无向图进行的BFS实现,有向图就只添加一条边就可以了使用样例:#include <iostream>#include <algorithm>#include <cstring>#include <queue>#include <set>#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#define LL long long using n原创 2020-11-26 15:31:38 · 112 阅读 · 0 评论 -
链式前项星实现图的DFS
实现的是无向图的遍历,有向图只存一条边即可实验图片:#include<iostream>#include<algorithm>#include<set>#include<cstring>#define FAST ios::sync_with_stdio(flase),cin.tie(0),cout.tie(0)#define LL long longusing namespace std;const int N = 1e5 + 10;原创 2020-11-26 15:04:28 · 92 阅读 · 0 评论 -
扩展欧几里得算法
题目:给定n对正整数ai,bi,对于每对数,求出一组xi,yi,使其满足ai∗xi+bi∗yi=gcd(ai,bi)。输入格式第一行包含整数n。接下来n行,每行包含两个整数ai,bi。输出格式输出共n行,对于每组ai,bi,求出一组满足条件的xi,yi,每组结果占一行。本题答案不唯一,输出任意满足条件的xi,yi均可。数据范围:1 ≤ n ≤ 10^5,1 ≤ ai , bi ≤ 2 ∗10^9输入样例:24 68 18输出样例:-1 1-2 1#include <原创 2020-11-24 21:26:10 · 341 阅读 · 0 评论 -
板子 欧拉函数
题目:给定n个正整数 ai ,请你求出每个数的欧拉函数。欧拉函数的定义1 ~ N 中与 N 互质的数的个数被称为欧拉函数,记为ϕ(N)。输入格式第一行包含整数n。接下来n行,每行包含一个正整数 ai 。输出格式输出共n行,每行输出一个正整数 ai 的欧拉函数。数据范围1 ≤ n ≤ 100,1 ≤ ai ≤ 2 ∗ 109#include <iostream>#include <algorithm>using namespace std;int Ou原创 2020-11-23 14:19:34 · 92 阅读 · 0 评论 -
链式前项星
存图,存链表的时候都一般会使用这个结构体数组来实现数据的存储。结构体实现:struct E{ int to,w,next; // 起点就是当前结构体的序号(或者序号 + 1 根据实际情况判断),to是这条边的终点,w是这条边的权值,next是下一个可达节点的结构体序号}Edge[Max_size]; // Edge[tot] 是一个空节点 int tot,Head[Max_size]; // tot是内存池指针,指向的是最近的一个还没有被使用的内存区域 // Head数组里面装的是原创 2020-10-25 20:14:37 · 155 阅读 · 0 评论 -
并查集模板
并查集的精髓在find寻祖宗函数一共有n个数,编号是1~n,最开始每个数各自在一个集合中。例题:现在要进行m个操作,操作共有两种:“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;“Q a b”,询问编号为a和b的两个数是否在同一个集合中;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。输出格式对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内,则输出“Y原创 2020-09-14 23:15:39 · 91 阅读 · 0 评论 -
Tire 树模板
acwing 模板题目#include<iostream>using namespace std;const int N = 1e6 + 10;int idx,son[N][26],n,cnt[N];char x[N],op[2];void Insert(char *str){ int p = 0; for(int i = 0;str[i] != '\0';i ++ ) { int u = str[i] - 'a';原创 2020-09-14 14:48:01 · 124 阅读 · 0 评论 -
堆操作模板
#include<iostream>#include<string>using namespace std;const int N = 1e5 + 10;int h[N],ph[N],hp[N],n,cnt,m; // cnt表明现在容器中总的元素个数(可以作为容器末尾元素的指针) // m记录当前所使用元素的序号 // p理解为pointer指针 h理解为heap ph是从指针数组指向堆的映射 ph[k] 通俗理解就是第k个插入的元原创 2020-09-13 19:13:08 · 82 阅读 · 0 评论 -
堆排序模板
#include<iostream>#include<algorithm>using namespace std;const int N = 1e5 + 10;int h[N],n,m,cnt;void down(int x) // x是元素在堆中的下标{ int temp = x; if(x * 2 <= cnt && h[x * 2] < h[temp]) temp = x * 2; // 先左子和根比较 i原创 2020-09-13 16:23:51 · 95 阅读 · 0 评论 -
KMP 算法模板
KMP 背住就行 理解太繁琐了#include<iostream>using namespace std;const int N = 1e5 + 10,M = 1e6 + 10;int n,m,ne[N];char p[N],s[M];int main(void){ cin >> n >> p + 1 >> m >> s + 1; for(int i = 2,j = 0;i <= n;i++)原创 2020-09-12 18:07:02 · 99 阅读 · 0 评论 -
单调队列的模板
#include<iostream>using namespace std;const int N = 1e6 + 10;int n,k,que[N],a[N],hh,tt = 0; // 开辟两个数组来,其中一个来存原来的数组值,其中一个作为单调栈来存数组的下标(一种映射),其实单调栈和单调队列都不会存太多的数据,只是存储一个中间的状态,并实时更新// 统一书写规则,tt指向整个容器的向上开口处,总是指向一个待存入的坐标(此时的坐标中是没有数据的)int main(void原创 2020-09-10 20:55:03 · 172 阅读 · 0 评论 -
单调栈的模板
#include<iostream>using namespace std;const int N = 1e5 + 10;int stk[N],tt,M;void Push(int x){ stk[tt] = x; tt ++;} // 为了保证语言的完备性 所以始终在栈的数组实现中 将tt指向下一个待插入的下标int main(void){ cin >> M; while(M --) { int x;原创 2020-09-10 19:30:41 · 128 阅读 · 0 评论 -
数组链表模板
实现一个单链表,链表初始为空,支持三种操作:(1) 向链表头插入一个数;(2) 删除第k个插入的数后面的数;(3) 在第k个插入的数后插入一个数现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令可能为以下几种:(1) “原创 2020-09-09 17:48:23 · 197 阅读 · 0 评论 -
CF div3_B
#include<iostream>using namespace std;int n;int main(void){ cin >> n; for(int i = 0;i < n;i++) { long long int a,b,x,y,c; cin >> a >> b >> x >> y >> c; // 10 11 9 1 10 int M1 = max(原创 2020-09-07 12:52:10 · 351 阅读 · 0 评论 -
离散化模板
/*离散化就是在值域很大但是,元素个数很少的情况下使用,具体一点就是数轴上排列点很稀疏的情况下使用主要的应用就是:将数字和他们对应的下标通过映射对应到一个新的数组中去,使得这个数组的排列更加紧凑 (注意对应的时候应该将所有可能用到的坐标都囊括进去,无论在那个坐标上有没有值存在)例题:假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数原创 2020-09-06 21:03:49 · 102 阅读 · 0 评论 -
区间合并模板
/*给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。*/#include<iostream>#include<vector>#include<algorithm>using namespace std;vector<pair<int, int>> A;int n;void merge原创 2020-09-06 19:03:13 · 107 阅读 · 0 评论 -
双指针模板
/*双指针算法主要是用来维护两个窗口,在归并排数中就使用了双指针来指向两个不同的序列,在快速排序中使用了双指针来指向同一个序列其也主要分为这两种模式,指向同一个和非同一个序列核心作用:优化双重循环 讲n^2 的复杂度降为n应用:例子:1.输出用空格隔开的各个单词 2.最大的连续子序列通用的模板:for(int i = 0;i < n;i++){ while(j <i && check(i,j)) j++; // j可以向后面移动的逻辑 //根据题原创 2020-09-06 16:10:20 · 263 阅读 · 0 评论 -
差分模板
一维差分:/*差分:(前缀和的逆运算) 原数组: a1,a2..........an 构造: b1,b2..........bn 使得bn可以满足ai = b1 + b2 + b3 + ... + bi; (构造一个数组使得元素组为构造数组的前缀和数组) 作用:对b求一次前缀和的运算就可以算出原数组a 对于构造的过程可以这样来理解: 在a中对[L,R]中的所有数加上C 可以在b中对b[L] + c,和对b[R + 1] - c即可实现在求出的原数组中,L到R的数据都被加上了一个c原创 2020-09-05 15:51:42 · 428 阅读 · 0 评论 -
前缀和模板
一维的前缀和模板/*前缀和: 原数组: a1,a2,a3,.......,an 前缀和: si = a1 + a2 + a3 + ... + ai = s(i - 1) + ai 递推公式 bi 为 ai 的前缀和数组的话 bi的每个元素都是ai中的元素从第一个元素加到第i个元素的和(下标从1开始计数) b0 设置为0作用: 快速求出原数组中的一段数的和 ([L,R]) sum = br - b(l - 1)*/#include<iostream>us原创 2020-09-05 15:27:21 · 128 阅读 · 0 评论 -
高精度除法模板
#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;// 除法运算一般也是一个比较大的数字取除以一个可以用int存进去的较小的数字,且这里做的是简单的整数除法,所以会有余数产生(使用r将余数带出)vector<int> div(vector<int>& A, int b, int&原创 2020-09-05 12:53:49 · 211 阅读 · 0 评论 -
高精度乘法模板
#include<iostream>#include<vector>#include<string>using namespace std;vector<int> A;int b;//大数字相乘一般是一个大数字,和一个较小数字(可以在int内存下)这种情况vector<int> mul(vector<int>& A, int b){ vector<int> C; int t =原创 2020-09-05 11:20:24 · 108 阅读 · 0 评论 -
高精度减法模板
#include<iostream>#include<vector>#include<string>using namespace std;vector<int> A;vector<int> B;//先创建两个向量数组,一个作为被减数容器,一个作为减数容器int cmp(vector<int>& A, vector<int>& B){ if (A.size() != B.size原创 2020-09-05 11:12:21 · 116 阅读 · 0 评论 -
高精度加法计算模板
#include<iostream>#include<vector>#include<string>using namespace std;vector<int> A;vector<int> B;//先创建两个向量数组,作为存放两个加数的容器vector<int> add(vector<int>& A, vector<int>& B){ vector<int>原创 2020-09-05 11:01:53 · 150 阅读 · 0 评论 -
cin 与 scanf 的差速补偿
在实际的代码过程中,cin可能比scanf要慢上一倍。通过加上:ios::sync_with_stdio(false); //来使cin获得和scanf一样的速度原创 2020-09-03 20:25:01 · 161 阅读 · 0 评论 -
ZY哥的快速幂
void quick_power(int x,int y){//x为底数,y为指数 int ans = 1; while(y){ if(y & 1 == 1) ans += x; x = x * x; y >>= 1; } cout<<ans<<endl;}原创 2020-09-03 19:10:40 · 119 阅读 · 0 评论 -
#2020-09-01 快速排序模板 归并排序模板 二分模板
//快速排序模板#include<iostream>using namespace std;const int N = 1e6 + 10;int n;int q[N];void quick_sort(int q[], int l, int r){ if (l >= r) return;//区间内部没有数据 就不用再进行排序 int x = q[(l + r) / 2], i = l - 1, j = r + 1; //取端点的时候会导致时间耗费较多,常直接取中值原创 2020-09-01 23:19:29 · 129 阅读 · 0 评论