11 2021 档案
摘要:Trie树 Trie树是一种用于存储字符串和查找字符串的高效数据结构,插入查找的时间复杂度均为 对于数组son[N] [x], N在模板中,表示所有字符串的总长度,等价于idx的最大值,假设有n个数,把每个数的二进制位存入Trie数后,N的最大值就为所有数字的二进制位数之和。而x则表示对
阅读全文
摘要:二分图 定义 二分图,又称二部图,英文名叫 Bipartite graph。 二分图是什么?节点由两个集合组成,且两个集合内部没有边的图。 换言之,存在一种方案,将节点划分成满足以上性质的两个集合。 二分图的性质:二分图一定不存在长度为奇数的环 染色法判定是否为二分图 思路分析:我们可以对每个点进行
阅读全文
摘要:最小生成树(MST) 对于稀疏图: 1、朴素Prim算法 时间复杂度 算法分析:和朴素Dijkstra的算法流程十分相似,定义集合S表示最小生成树的集合,每次先找出集合外距离集合最近的点t,随后再用t去更新其他点到集合的距离。 858. Prim算法求最小生成树 - AcWing题库
阅读全文
摘要:最短路算法: 单源最短路:所有边权都是正数 1、Dijkstra算法: 对于稠密图(边相对较多):朴素Dijkstra 时间复杂度: 思路分析:该算法是基于贪心思想的,每次找到最小的没有被用来更新其他点的dist[t],再用它来更新它的出边,并在st中打上标记即可 849.
阅读全文
摘要:KMP匹配 定义nextt[i] 为 模式串b中的第i个数字的真前后缀最大公共子串长度 **eg: ababac 下标从1开始,nextt[1] = 0, next[2] = 0, next[3] = 1(因为b[1]和b[3]是此时相同前后缀的最大长度)......依次类推 ** 至于kmp的原理
阅读全文
摘要:线性DP(部分) 例:aw272 LCIS 272. 最长公共上升子序列 - AcWing题库 思路分析: 题目是LCS与LIS的结合,那么我们显然可以结合两道经典例题的思路, 定义f[i] [j] 表示,在a[1...i] 与 b[1...j] 中出现的以B[j]为结尾的数字。 随后我们先遍历a[
阅读全文
摘要:背包DP 01背包 (每个物品只能选一个或者不选) //#pragma comment(linker, "/STACK:10240000000000,10240000000000") //#pragma GCC optimize(2) #include <bits/stdc++.h> using n
阅读全文
摘要:Problem - C - Codeforces 思路分析: 首先我们要求出最小次数,可以得知我们最多只需要两步,取x = n 和 x = n - 1 则一定能符合题意 因此我们只需判断是否能通过0次或1次来满足题意 1、对于0次 我们只需要先遍历一遍字符数组,看看是否有不满足的即可 2、对于1次
阅读全文
摘要:拓展欧几里得: ll exgcd(ll a, ll b, ll &x, ll &y) { if(!b) { x = 1, y = 0; return a; } ll ans = exgcd(b, a % b, y, x); y -= a / b * x; return ans; //返回的还是gcd
阅读全文
摘要:P2158 [SDOI2008] 仪仗队 题目描述 作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N×N 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C 君希望你告诉他队伍整齐时能看到的学生人数
阅读全文
摘要:#质数 1、试除法 For(int i = 1, i ≤ sqrt(x); i++) 2、埃氏筛(优化版) 求N以内的质数: 对于每个数x,只需从x²开始,将x²,(x+1)*x, (x+2)*x, ... ,[N/x]*x标记为合数即可; //#pragma comment(linker, "/S
阅读全文
摘要:离散化 1、排序 2、对排序后的数据去重(可以使用unique),同时用1-m的数字和新数组储存; void discret() { sort(a + 1, a + 1 + n); int tot = 0; For(i, i, n) { if(i == 1 || a[i] != a[i-1]) un
阅读全文
摘要:0x04 二分 两种二分写法: int l = 0, r = n + 1; while(l < r) { mid = l + (r - l) / 2; if(a[mid] >= x) r = mid; else l = mid + 1; } while(l < r) { mid = (l + r +
阅读全文
摘要:前缀和 f[i] [j]为前缀和数组,a[i] [j]为原数组 f[i] [j] = f[i-1] [j] + f[i] [j-1] - f[i-1] [j-1] + a[i] [j] 算区间前缀和,画个图推公式 差分 原数组a[i], 差分数组f[i] = f[i] - f[i-1], f[1]
阅读全文
摘要:位运算 1、a*b%p 方法一:将b用二进制表示然后递推累乘 for(; b; b >>= 1) { ans = (ans + (b & 1) * a % p) %p; a = a * 2 % p; } 方法二:将ab mod p 转换成 ab - ⌊ab/p⌋ * p 令c = ⌊ab/p⌋; 用
阅读全文
摘要:树状数组 树状数组可以将一整个区间划分为几个区间,T[i]包含的A[]原数组数量为 lowbit(i), 单点更新,区间查询 //单点更新操作 void update(int i, int x) { for(; i <= n; i += lowbit(i)) { t[i] += x; } } //区
阅读全文
摘要:ST表 处理RMQ问题,即区间最值 用O(nlogn)预处理,O(1)查询最值 思想:倍增 maxx[i] [j] 表示从i位置开始的个数字的最大值 板子 //#pragma comment(linker, "/STACK:10240000000000,10240000000000") /
阅读全文