摘要:
快速读入 可以根据题目描述自行修改。 void Init() { char ch; ch = getchar(); while (ch < 'A' || ch > 'Z') ch = getchar(); while (ch >= 'A' && ch <= 'Z') { A[++lena] = ch 阅读全文
摘要:
前言 这篇博客我自认为写的非常清楚,不需要任何基础,只要会 \(\text{C++}\) 语言基础即可学懂。 任何一个地方我都没有默认已经学过了,完全从 \(0\) 开始的 \(\text{FHQ−Treap}\) 教学! 好耶!我们开始吧!ヽ(✿゚▽゚)ノ 哒哒哒哒哒! FHQ-Treap \(\ 阅读全文
摘要:
Tarjan B3609 [图论与代数结构 701] 强连通分量 std::vector<int> t[maxn]; //vector 存图 std::vector<int> SCC[maxn]; std::stack<int> stk; int n, m, tot, cnt; int vis[ma 阅读全文
摘要:
ll ans[100] ,cnt; //拓扑序列及其元素个数 ll deg[100]; //所有点的入度 void topsort() { queue<ll> q; for (int i = 1; i <= n; ++i) if (deg[i] == 0) //寻找最开始入度就为0的点 q.push 阅读全文
摘要:
Kruskal 前置:并查集 struct node { ll u, v, w; } t[200005]; ll fa[200005], n, m, ans, eu, ev, cnt; inline bool cmp(node a, node b) { return a.w < b.w; } inl 阅读全文
摘要:
P3379 【模板】最近公共祖先(LCA) 邻接表存图。 struct node{...}; void add(...){} ll dep[500010], fa[500010][23]; ll head[500010], tot; ll n, m, s; ll dep[N], fa[N][25]; 阅读全文
摘要:
介绍 我们遇到一些有 \(n\) 个元素的集合应用问题中,当给出两个元素的一个无序对 \((a,b)\) 时,需要快速合并 \(a\) 和 \(b\) 分别所在的集合,并查集就是这样的用于处理分离集合的抽象数据类型。它的作用就是动态地维护和处理集合元素之间的复杂关系。 ### 操作 使用并查集应首先 阅读全文
摘要:
SPFA SPFA能处理负边权,可以判断负环。也可以求最长路。 最短路 #include <queue> queue<int> q; void SPFA(int s) { fill(dis + 1, dis + 1 + n, 2147483647); //初始边无限大 memset(vis, 0, 阅读全文
摘要:
Luogu-CF1365A 题目分析 如果当前玩家想要在网格图上找一个位置设置为 \(1\),条件式这一个位置所在的行以及列上都没有其它的 \(1\)。 观察到数据范围只有 $1 \leq n,m \leq 50 $,我们可以考虑直接在网格图上操作。 在读入的时候,只要读入到当前位置的数为 \(1\ 阅读全文
摘要:
求单源 \(s\) 到任意一点的最短路径。最短路径保存在数组 dis 中。 链式前向星 #include <queue> priority_queue<pair<ll, ll>> q; void dijkstra(int s) { memset(dis, 0x3f, sizeof(dis)); // 阅读全文
摘要:
vector 存图 struct node{ ll to, w; }; vector<node> t[maxn]; void add(const int u, const int v, const int w) { t[u].push_back((node){v, w}); } 链式前向星存图 如果 阅读全文
摘要:
01背包 最大价值 背包数量为 \(V\),有 $n$件物品,重量为 \(w_i\),价值为 \(c_i\)。求能获得最大价值。 ll V, n, w[10000], c[10000], f[10000]; int main() { V = read(); n = read(); for (int 阅读全文
摘要:
LCS 操作对象:两个长度不一定相等的字符串。 例题 string s, t; int f[maxn][maxn]; int main() { cin >> s >> t; int ls = s.length(), lt = t.length(); for (int i = 1; i <= ls; 阅读全文
摘要:
二分 求一个序列的最长上升子序列个数。 本程序采用边读边处理 + 二分法。 ll f[maxn], ans = 1; //注意答案个数初始化为1 int main() { ll n = read(); for (int i = 1; i <= n; ++i) { int x = read(); if 阅读全文
摘要:
使用前提:数列为有序数列。 ①数组内 //查找范围:[ begin , end ) ,左闭右开区间。 *lower_bound(begin, end, num); //返回第一个 >= num 的数的数值 lower_bound(begin, end, num) - begin; // 返回下标 实 阅读全文
摘要:
快速乘法取余 给定三个整数 \(a,n,mod\) ,求 \(a \times n ~\%~mod\) 的值。 inline int mult_mod(int a, int n, int mod) { int ans = 0; while (n > 0) { if (n & 1) ans = (an 阅读全文
摘要:
最大公约数 ① 标准 inline int gcd(int a, int b) { int r; while (b > 0) { r = a % b; a = b; b = r; } return a; } ② 位运算 inline int gcd(int a, int b) //a,b不能为0 { 阅读全文
摘要:
给定一个整数 \(n\) ,求出 $[2,n] $ 之间的所有素数。 prime 数组存放已经筛出的素数, \(m\) 代表素数个数(也就是说遍历时从 \(1\) 遍历到 \(m\) 即可),v 数组代表有没有被标记,避免重复筛。 int v[maxn], prime[maxn], n, k, t, 阅读全文
摘要:
珂朵莉树 神奇的暴力数据结构 例题 \(n\) 个数,\(m\) 次操作 \((n,m≤105)\) 操作: 区间加 区间赋值 区间第k小 求区间幂次和 数据随机,时限 \(2s\)。 关键操作:推平一段区间,使一整段区间内的东西变得一样。保证数据随机 #include <set> #include 阅读全文
摘要:
Treap 您需要写一种数据结构,来维护一些数,其中需要提供以下操作: 插入 \(x\) 数 删除 \(x\) 数(若有多个相同的数,因只删除一个) 查询 \(x\) 数的排名(排名定义为比当前数小的数的个数 \(+1\) ) 查询排名为 \(x\) 的数 求 \(x\) 的前驱(前驱定义为小于 \ 阅读全文