随笔分类 - 算法竞赛
摘要:struct SAM { static const int MAXN = 1e6 + 10; int nxt[2 * MAXN][26]; int len[2 * MAXN]; int lnk[2 * MAXN]; int cnt[2 * MAXN]; int siz; int lst; void
阅读全文
摘要:struct BigInt { static const int BASE = 1000000000; static const int DLEN = 9; int len; vector<int> a; BigInt(int v = 0) { len = 0, a.resize(2); do {
阅读全文
摘要:强连通缩点: 算法复杂度: Kosaraju算法:初始化,加边,两次dfs,复杂度O(n+m) 强连通分量缩点算法:遍历每个点每条边,复杂度O(n+m) 对边排序去重:复杂度O(n+mlogm) 注意: 1、最好先 Init() ,然后再 AddEdge() 2、维护缩点时点的性质对新点的影响在 d
阅读全文
摘要:有向图才会有forward edge和cross edge。无向图是没有这两种edge的。 void dfs(int u) { vis[u] = 1; for(int &v : G[u]) { switch(vis[v]) { case 0: // tree edge vis[v] = 1; dfs
阅读全文
摘要:struct ACM { static const int MAXN = 1e6 + 10; int ch[MAXN][26], fail[MAXN]; int cnt; int R[MAXN]; void Init() { ms(ch[0]), fail[0] = 0; cnt = 0; } in
阅读全文
摘要:https://oi-wiki.org/string/kmp/ 研究的对象其实主要是前缀函数,而不是KMP算法,KMP算法只是前缀函数的一个应用,如何求前缀函数,理解前缀函数的作用才是关键。 简单理解然后应用 前缀函数:对字符串s(从1开始)求其前缀函数pi,则pi[i]表示长度为i的s的前缀s[1
阅读全文
摘要:struct PAM { static const int MAXN = 1e6 + 10; char s[MAXN]; int ch[MAXN][26], len[MAXN], fail[MAXN], dep[MAXN]; int cnt, slen, lst; int R[MAXN]; void
阅读全文
摘要:根据不同的需求要改的太多了,注意如果不需要防hack可以关闭anti_hack,或者在多个字符串共享同一个哈希算法的时候让anti_hack值 哈希值为64位有符号整数 进行2次哈希,输出为long long的版本。 基本上只维护这个版本了,不太想维护其他版本的。 字符串的多项式哈希的公式 \[ha
阅读全文
摘要:适用于非负权图,所有的边权都是非负数。 或者从s节点出发的子图中,边权都是非负数的也可以。(从s出发没办法适用的,是负数甚至复数都无所谓。) Dijkstra算法 标准版本,带有vis数组方便检查是否从s出发可以到达i。 下面的版本中是从1开始的n个点。如果是从0开始的话要改一下。 namespac
阅读全文
摘要:验证链接:洛谷P5656 | 洛谷P1082 | 洛谷P3811 LCE1这个算法找到的是x的最小非负整数解。剩下的事情交给倍增算法。 注意特判0和负数的情况,下面存在除以0的时候。假如传入的数字有负数,则返回值需要特殊处理。 namespace exGCD { ll exgcd(ll a, ll
阅读全文
摘要:中国剩余定理 一元线性同余方程组 $ x\equiv r_1 (\mod m_1)\ x\equiv r_2 (\mod m_2)\ x\equiv r_3 (\mod m_3)\ ...\ x\equiv r_n (\mod m_n)\ $ 其中,对于任意的 \(i\neq j\) , \(gcd
阅读全文
摘要:namespace SegmentTree { #define ls (o << 1) #define rs (o << 1 | 1) ll bse[3] = {13, 1331, 2333}; ll mod[3] = {998244353, 1000000007, 1000000009}; ll
阅读全文
摘要:新模板,使用了模板和默认值、幺元等,分离node中的数据维护部分。当维护的数据与l,r有关时,节点内需要存l,r,可能导致空间开销比较大。当query的merge的成本太高时,不能用下面这个模板,必须用旧模板。旧模板中query的流程和每个节点中的数据相关,也就是说query是可以理解sum[u]和
阅读全文
摘要:并查集 对并查集及其常见的扩展的介绍,以及模板的梳理,部分模板可能没有经过实际验证?要多想一想是不是正确的。 TODO:搭建配套的测试代码和用例,用一个已知正确的暴力代码/验证过的并查集代码对拍出正确的答案,然后保存到git中用脚本进行自动化测试。 Completed in November 202
阅读全文
摘要:维护翻转操作 struct Treap { private: static const int MAXN = 200000 + 10; int ls[MAXN], rs[MAXN]; int rnd[MAXN], siz[MAXN]; int del[MAXN], dnt; int cnt, roo
阅读全文
摘要:突发奇想可以用拓扑排序的写法,从叶子开始删,然后deg为0的是父亲,deg不为0的是后继节点,最后会剩下一个环deg都是2。 for(int i = 1; i <= n; ++i) { G[i].clear(); deg[i] = 0; cnt[i] = 0; } for(int i = 1; i
阅读全文
摘要:https://codeforces.ml/contest/888/problem/G struct TrieNode { int cnt; int num; int nxt[2]; void Init() { cnt = 0; num = 0; memset(nxt, 0, sizeof(nxt)
阅读全文
摘要:并查集找格子图的连通分量 int n, m; char g[1005][1005]; int fa[1000005]; int cnt[1000005]; int id[1005][1005]; int x[1000005]; int y[1000005]; int find(int x) { re
阅读全文
摘要://#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune
阅读全文
摘要:要么使用atan2的long double类型,要么使用整数。 无误差版本的极角排序。 int n; struct Vector { ll x; ll y; int id; Vector() {} Vector(ll _x, ll _y) { x = _x, y = _y; } bool top()
阅读全文

浙公网安备 33010602011771号