
算法-总结
简单数据结构和算法
Att1cusss
被子里面喊冲锋!!!
展开
-
树状数组
#include<iostream>using namespace std;/* 树状数组 / BIT / Binary Index Tree 求前缀和 / 单点增加*///原数列int a[1000];//树状数组,BIT[i]表示区间a[i - lowbit(i) + 1]至a[i]的和(闭)int BIT[1000];int n;//length of a//lowbit运算,取当前最低位的1及其低位0组成的数,lowbit(1100B) = 100Bint l原创 2021-02-12 12:39:36 · 74 阅读 · 0 评论 -
字典树(前缀树、单词查找树)
#include<iostream>using namespace std;/* 名称 : 字典树 / 前缀树 / 单词查找树 函数 : 插入 | 查询*/int trie[100][26];//100个节点,trie[i][j]表示:i号节点指向的存储字符('a' + j)的节点编号int nodeCnt = 0;//记录节点编号//插入void insert(char str[], int l) { int cur = 0;//入口始终是0号节点 for (int原创 2021-02-10 16:23:12 · 185 阅读 · 0 评论 -
并查集c++
#include<iostream>using namespace std;/* 快速判断两个元素是否在同一集合 寻找根节点 / 合并元素*/int fa[1000];//fa[i] 表示i的父节点 当fa[i] == i 时,i是根节点int depth[1000];//depth[i]表示以i为根的数的深度/* 寻找根节点 若根节点不是本身,递归寻找父节点的父节点,直到找到根节点 fa[x] = find(fa[x]) 每次查找压缩整条路径,将途径节点的父节点设为根节原创 2021-02-08 21:21:02 · 85 阅读 · 0 评论 -
二分查找与注意事项
二分查找很简单,但是也有容易被忽视的细节如何防止因写错二分而陷入无尽循环之中呢?#include<iostream>using namespace std;int a[100];//在已排序的a中(从小到大)的闭区间[l, r]中找x的下标,没有找到返回-1int BinarySearch(int a[], int l, int r, int x) { while (l < r) { //右移是向下取整的,那么这里的mid是属于左半区间 //因此,如果写(l + r原创 2021-01-31 22:15:20 · 170 阅读 · 0 评论 -
最大公因数与最小公倍数
最大公因数欧几里得算法 辗转相除int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b);}最小公倍数int lcm(int a, int b) { return a * b / gcd(a, b);}原创 2021-01-30 09:24:29 · 135 阅读 · 0 评论 -
等比数列求和
分治 + 快速幂typedef long long ll;ll fastpow(ll base, ll power, ll mod) { ll ans = 1; while (power > 0) { if (power & 1) ans = ans * base % mod; power >>= 1; base = base * base % mod; } return ans;}/** the sum of : 1 + p^1 + p^2 + ..原创 2021-01-27 14:33:21 · 565 阅读 · 0 评论 -
简单素数筛
空间换时间#include<iostream>#define RANGE 2000using namespace std;int prime[RANGE];void calc() { for (int i = 0; i < RANGE; i++) prime[i] = 1; for (int i = 2; i < RANGE; i++) { if (prime[i] == 1) { for (int j = i * i; j < RANGE; j +原创 2021-01-27 11:14:02 · 100 阅读 · 1 评论 -
快速幂与大数乘法
一、快速幂typedef long long ll;/* (base ^ power) % mod --> [base ^ (power / 2 + power % 2)] % mod --> {[(base * 2) ^ (power / 2)] * [base ^ (power % 2)]} % mod*///快速幂 + 取模ll fastpower(ll base, ll power, ll mod) { if (mod < 2) return 0; ll原创 2021-01-21 19:33:35 · 137 阅读 · 0 评论 -
归并排序与求逆序数
一、归并排序#include<iostream>using namespace std;int a[100], b[100];/* a原数组,b中间数组,前半段的起始, m前半段的终止,也是两段的中点,e后半段的结束*/void merge(int a[], int l, int m, int e, int b[]) { /* - 假设按从小到大排序 - 现有两段已排序的序列 p1和p2分别指向这两个序列的开头 p指向中间数组的开头,中间数组是用来临时保存排序结原创 2021-01-20 22:25:20 · 165 阅读 · 0 评论 -
二次项系数C(n, k)
利用Cnk = Cn-1k-1 + Cn-1kll dp[2020][2020];ll C(int n, int k){ if (k == 0 || k == n) return 1; if (dp[n][k]) return dp[n][k]; return dp[n][k] = (C(n - 1, k - 1) + C(n - 1, k));}原创 2021-01-26 17:35:08 · 1305 阅读 · 0 评论 -
二进制状态压缩
二进制状态压缩.1二进制状态压缩,是指将一个长度为 m 的 bool 数组用一个 m 位二进制整数表示并存储的方法。//取出整数 n 在二进制表示下的第 k 位 (n >> k) & 1;//取出整数 n 在二进制表示下的第 0 ~ k - 1 位 (后 k 位) n & ((1 << k) - 1)//把整数 n 在二进制表示下的第 k 位 取反 n ^ (1 << k)//对整数 n 在二进制表示下的第 k 位赋值 1 n原创 2021-01-22 15:16:40 · 794 阅读 · 0 评论