随笔分类 -  算法竞赛

摘要:struct CutvertexBridge { static const int MAXN = 2e5 + 10; static const int MAXM = 2e6 + 10; int n, m, t; struct Edge { int v, nxt; } e[MAXM * 2]; int 阅读全文
posted @ 2021-01-24 20:47 purinliang 阅读(147) 评论(0) 推荐(0)
摘要:struct Splay { static const int MAXN = 3e6 + 10; int top, root, ch[MAXN][2], pa[MAXN]; int val[MAXN], cnt[MAXN], siz[MAXN]; void _PushUp(int x) { siz[ 阅读全文
posted @ 2021-01-24 18:06 purinliang 阅读(69) 评论(0) 推荐(0)
摘要:Lyndon串:当且仅当字符串 \(s\) 的字典序严格小于其所有后缀的字典序时,字符串 \(s\) 是Lyndon串。当且仅当字符串 \(s\) 的字典序严格小于其所有非平凡循环同构串的字典序时,字符串 \(s\) 是Lyndon串。 Lyndon分解:字符串 \(s\) 的Lyndon分解为 \ 阅读全文
posted @ 2021-01-24 16:34 purinliang 阅读(126) 评论(0) 推荐(0)
摘要:无源汇上下界可行流 所有点都要满足流量平衡的可行流。每条边的流量上界为 \(F\) ,流量下界为 \(f\) ,一开始加入初始流量,对于每个点 \(i\) ,设超级源 \(S\) 和超级汇 \(T\) ,设初始入流量-初始出流量为 \(M\) , 若M=0就不用管,若M>0(入流量过大),则连接 \ 阅读全文
posted @ 2021-01-24 12:12 purinliang 阅读(120) 评论(0) 推荐(0)
摘要:残量网络:剩余容量大于0的边组成的子图。(注意反向边也可以有剩余容量大于0) 增广路:残量网络中,从源点到汇点的路径 阅读全文
posted @ 2021-01-23 19:49 purinliang 阅读(71) 评论(0) 推荐(0)
摘要:验证链接:[洛谷P3386 - 二分图最大匹配] 最大流 int N = n1 + n2, S = ++N, T = ++N; dinic.Init(N, S, T); for(int i = 1; i <= n1; ++i) { int V1i = i; dinic.AddEdge(S, V1i, 阅读全文
posted @ 2021-01-23 17:29 purinliang 阅读(58) 评论(0) 推荐(0)
摘要:验证链接:[洛谷P3376 - 网络最大流] | [洛谷P1361 - 小M的作物] | [洛谷P3386 - 二分图最大匹配] 设点数为 \(n\) ,边数为 \(m\) ,那么Dinic算法的时间复杂度是 \(O(n^2m)\) ,在稀疏图上效率和EK算法相当,但在稠密图上效率要比EK算法高很多 阅读全文
posted @ 2021-01-23 16:54 purinliang 阅读(169) 评论(0) 推荐(0)
摘要:下面用 \((u,v,w)\) 表示节点 \(u\) 到节点 \(v\) 的容量为 \(w\) 的有向边。 最大权闭合子图 最大权闭合子图,指对于某个节点 \(u\) ,若选择节点 \(u\) ,则必须选择节点 \(u\) 可达的所有点集。 对于正权点u,连接S到u,并在答案中默认选择这个正权。对于 阅读全文
posted @ 2021-01-23 15:34 purinliang 阅读(430) 评论(0) 推荐(0)
摘要:验证链接:左偏树:https://www.luogu.com.cn/problem/P3377 验证链接:堆:https://www.luogu.com.cn/problem/P3378 维护一种数据结构,支持下列操作: 插入新元素到某个集合中 查询某个集合中的最小元素 删除某个集合中的最小元素 合 阅读全文
posted @ 2021-01-22 17:58 purinliang 阅读(81) 评论(0) 推荐(0)
摘要:验证链接:https://www.luogu.com.cn/problem/P5091 namespace exET { int calcA(char *a, int mod) { ll res = 0; for(int i = 1, n = strlen(a + 1); i <= n; ++i) 阅读全文
posted @ 2021-01-22 11:52 purinliang 阅读(370) 评论(0) 推荐(0)
摘要:验证链接:https://www.luogu.com.cn/problem/P3865 struct SparseTable { static const int MAXN = 200000 + 10; static const int MAXLOGN = 20; int n; int log2[M 阅读全文
posted @ 2021-01-21 10:33 purinliang 阅读(107) 评论(0) 推荐(0)
摘要:SG函数 const int MAXN = 600000; int n; int sg[MAXN]; int SG(int x) { // 默认值为-1 if(sg[x] != -1) return sg[x]; bool used[32] = {}; // 这里写递归到后继状态 for(int i 阅读全文
posted @ 2021-01-17 22:56 purinliang 阅读(484) 评论(0) 推荐(0)
摘要:后缀排序 我的字符串全部都是下标从1开始的, 千万要小心。 字符串 \(s[1, n]\) 中,有 \(n\) 个后缀,他们分别是 \(s[1, n], s[2, n], s[3, n], ..., s[i, n], ..., s[n, n]\) 。 对这 \(n\) 个后缀进行排序,由于他们长度不 阅读全文
posted @ 2021-01-17 18:49 purinliang 阅读(207) 评论(0) 推荐(0)
摘要:凯莱定理:n个点的完全图的生成树有n^(n-2)个。 长度为n-2,值域为[1,n]的Prufer序列和一个n个节点编号分别为[1,n]的无向连通图的生成树双射。 无根树变Prufer:每次选择一个编号最小的叶子删除他,在序列中记录其父亲,直到剩下最后的两个点。(假如再做一步,则Prufer序列一定 阅读全文
posted @ 2021-01-17 18:39 purinliang 阅读(161) 评论(0) 推荐(0)
摘要:Euler函数的定义:小于等于n的与n互质的正整数的个数,或者小于n的与n互质的自然数的个数。这两个结果都是指向 \(gcd(0,1)=1\) 也就是说 \(\varphi(1)=1\) 。 \(\varphi(p)=p-1\) \(\varphi(p^k)=p^k-p^{k-1}=p^{k-1}( 阅读全文
posted @ 2021-01-17 14:49 purinliang 阅读(1210) 评论(0) 推荐(0)
摘要:可持久化的单点修改线段树,同时也是可持久化数组 验证:https://www.luogu.com.cn/problem/P3919 ver[u]表示版本u的线段树根的位置。 所有的public操作都产生一个新的版本。 Build的时候生成不超过2n个节点,每次修改生成不超过logn个节点。 MAXM 阅读全文
posted @ 2021-01-17 05:37 purinliang 阅读(92) 评论(0) 推荐(0)
摘要:一个数有原根时,有 \(\varphi(\varphi(m))\) 个原根。 有原根的充要条件是, \(m=2,4,p^n,2p^n\) 其中p是奇质数。 求一个最小的原根,从 \(1\) 枚举到 \(m^{0.25}\) ,然后若 \(gcd(i,m)=1\) 并且对于 \(\varphi(m)\ 阅读全文
posted @ 2021-01-16 22:39 purinliang 阅读(858) 评论(0) 推荐(0)
摘要:事实上是并查集套一个可持久化数组。 int a[100005]; struct SegmentTree { #define ls lch[o] #define rs rch[o] static const int MAXN = 1e5 + 10; static const int MAXM = 2e 阅读全文
posted @ 2021-01-16 10:56 purinliang 阅读(103) 评论(0) 推荐(0)
摘要:算法的原理:把dfs的点分为三类: vis[u]=0 表示这个点从未访问 vis[u]=1 表示这个点在栈中,是u点的祖先 vis[u]=2 表示这个点已经退栈 Tarjan算法把lca(x,y)的查询丢给x和y的查询数组记录。后序遍历,总是会先遍历y再遍历x,那么vis[y]=2,要么x是y的祖先 阅读全文
posted @ 2021-01-16 09:06 purinliang 阅读(146) 评论(0) 推荐(0)
摘要:适用于无向图。其实找出来的是一片最小生成森林来的,并不一定是树,取决于原图是否连通。 int n, m; const int MAXM = 200000 + 10; struct DisjointSet { static const int MAXN = 200000 + 10; int fnd[M 阅读全文
posted @ 2021-01-15 21:47 purinliang 阅读(112) 评论(0) 推荐(0)