随笔分类 - 算法学习
摘要:例题 指数型枚举 输入样例: 3 输出样例: 3 2 2 3 1 1 3 1 2 1 2 3 题解: #include<iostream> using namespace std; const int N = 20; bool st[N]; int m; // 要输入的整数 void dfs(int
阅读全文
摘要:并查集 并查集可用来解决一些元素分组的问题,管理一系列不相交的集合 合并:把不相交的集合合并到一个集合 查询:查询两个元素是否在同一集合 原理 起初有1~n个元素,它们分别指向自己,父节点即为自己 当两个元素要合并时,用其中一个元素指向另外一个fa[i] = j, 代表 i 的父元素是 j 。 查询
阅读全文
摘要:一、堆的概念测试 1、堆的性质 是一颗完全二叉树 每个节点的值都大于或等于子节点的值,为最大堆;反之为最小堆 2、堆的存储 一般用数组来表示堆,下标从0开始。则下标为 i 的节点的父节点下标为(i-1)/2,其左右子节点分别为(2i + 1)、(2i + 2)。 下标从1开始 左右节点2i 、 2i
阅读全文
摘要:分解质因数 #include<iostream> #include<cmath> #include<cstring> using namespace std; int main() { int n; cin >> n; while(n--) { int x; cin >> x; for(int i
阅读全文
摘要:诶式筛法 void get_primes2() { for(int i = 2; i <= n;i++) { if(!st[i]){ primes[cnt++] = i; // 把素数存起来 for(int j = i + i; j <= n;j += i) st[j] = true; // 把质数
阅读全文
摘要:背包模板 01背包问题 朴素写法 #include<iostream> #include<algorithm> using namespace std; const int N = 1010; int v[N], w[N]; int f[N][N]; int main() { int n, m; c
阅读全文
摘要:图算法(数组版) 1.1最短路径Dijkstra算法 假设顶点是\(V_0到V_5\) 六个点,开始时候是没有连线的,但是已知能互相到达的顶点之间的边权。 步骤是每次从顶点0开始查找,找出距离顶点最短的点,然后标记该点为true,再查询该点能直达的其他点加上边权会不会比原先记录的距离值小 >即更新最
阅读全文
摘要:单链表 模板 #include<iostream> using namespace std; const int N = 100010; int idx, a[N], ae[N]; int head; // idx 表示当前还未填入的数,可以表示第几个插入的顺序,不过从0开始 // a[i]表示第
阅读全文
摘要:快排 void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { while (q[++ i] < x); whil
阅读全文