This commit is contained in:
newbie 2024-01-06 10:59:58 +08:00
parent 5eaf966f21
commit 7c52a3c538
3 changed files with 770 additions and 0 deletions

View File

@ -0,0 +1,303 @@
{
"Class_Array_tree": {
"prefix": "Class_Array_tree",
"body": [
"",
"template <class T>",
"class Array_tree {",
" public:",
" Array_tree() {}",
" Array_tree(int n) { this->n = n, tree = vector<T>(n + 1); }",
" void add(int id, T key) {",
" for (int i = id; i <= n; i += lowbit(i)) tree[i] += key;",
" }",
"",
" T get_sum(int id) {",
" T sum = 0;",
" for (int i = id; i; i -= lowbit(i)) sum += tree[i];",
" return sum;",
" }",
"",
" T get_sum(int l, int r) { return get_sum(r) - get_sum(l - 1); }",
"",
" private:",
" int n;",
" vector<T> tree;",
" int lowbit(int x) { return x & -x; }",
"};",
""
]
},
"Class_SGM_Tree": {
"prefix": "Class_SGM_Tree",
"body": [
"",
"class SGM_Tree {",
" public:",
" class point {",
" public:",
" ll sum, maxi, mini;",
" };",
"",
" vll a, lazy;",
" int n;",
" ll sum, maxi, mini;",
" vector<point> tree;",
"",
" SGM_Tree() {}",
" SGM_Tree(int n, vi v) {",
" // a下标默认从1开始,只需开n个点不需要n + 1",
" this->n = n;",
" lazy = vll(n * 4 + 1);",
" a.push_back(0);",
" for (int i = 1; i <= n; i++) a.push_back(v[i]);",
" tree = vector<point>(4 * n + 1), build(1, n, 1);",
" }",
" SGM_Tree(int n, vll v) {",
" // a下标默认从1开始,只需开n个点不需要n + 1",
" this->n = n;",
" lazy = vll(n * 4 + 1);",
" a.push_back(0);",
" for (int i = 1; i <= n; i++) a.push_back(v[i]);",
" tree = vector<point>(4 * n + 1), build(1, n, 1);",
" }",
" SGM_Tree(int n, int* v) {",
" // a下标默认从1开始,只需开n个点不需要n + 1",
" this->n = n;",
" lazy = vll(n * 4 + 1);",
" a.push_back(0);",
" for (int i = 1; i <= n; i++) a.push_back(v[i]);",
" tree = vector<point>(4 * n + 1), build(1, n, 1);",
" }",
"",
" void push_up(int k) {",
" int l = k * 2, r = k * 2 + 1;",
" tree[k].sum = tree[l].sum + tree[r].sum;",
" tree[k].maxi = max(tree[l].maxi, tree[r].maxi);",
" tree[k].mini = min(tree[l].mini, tree[r].mini);",
" }",
"",
" void push_down(int l, int r, int k) {",
" if (lazy[k]) {",
" int mid = l + r >> 1;",
" lazy[k * 2] += lazy[k];",
" lazy[k * 2 + 1] += lazy[k];",
" tree[k * 2].sum += lazy[k] * (mid - l + 1);",
" tree[k * 2 + 1].sum += lazy[k] * (r - mid);",
" tree[k * 2].maxi += lazy[k];",
" tree[k * 2 + 1].maxi += lazy[k];",
" tree[k * 2].mini += lazy[k];",
" tree[k * 2 + 1].mini += lazy[k];",
" lazy[k] = 0;",
" }",
" }",
"",
" void get_updata(int l, int r, int k, ll value) {",
" tree[k].sum += value * (r - l + 1);",
" tree[k].maxi += value;",
" tree[k].mini += value;",
" lazy[k] += value;",
" }",
"",
" void get(int k) {",
" sum += tree[k].sum;",
" maxi = max(maxi, tree[k].maxi);",
" mini = min(mini, tree[k].mini);",
" }",
"",
" void build(int l, int r, int k) {",
" if (l == r) {",
" tree[k].maxi = tree[k].mini = tree[k].sum = a[l];",
" return;",
" }",
" int mid = l + r >> 1;",
" build(l, mid, k * 2);",
" build(mid + 1, r, k * 2 + 1);",
" push_up(k);",
" }",
"",
" void updata(int l, int r, int L, int R, int k, ll value) {",
" if (L <= l && r <= R) {",
" get_updata(l, r, k, value);",
" return;",
" }",
" push_down(l, r, k);",
" int mid = l + r >> 1;",
" if (L <= mid) updata(l, mid, L, R, k * 2, value);",
" if (R > mid) updata(mid + 1, r, L, R, k * 2 + 1, value);",
" push_up(k);",
" }",
"",
" void query(int l, int r, int L, int R, int k) {",
" if (L <= l && r <= R) {",
" get(k);",
" return;",
" }",
" push_down(l, r, k);",
" int mid = l + r >> 1;",
" if (mid >= L) query(l, mid, L, R, 2 * k);",
" if (mid < R) query(mid + 1, r, L, R, 2 * k + 1);",
" }",
"",
" ll get_sum(int L, int R) {",
" sum = 0;",
" query(1, n, L, R, 1);",
" return sum;",
" }",
"",
" ll get_max(int L, int R) {",
" maxi = -inf;",
" query(1, n, L, R, 1);",
" return maxi;",
" }",
"",
" ll get_min(int L, int R) {",
" mini = inf;",
" query(1, n, L, R, 1);",
" return mini;",
" }",
"};",
""
]
},
"Class_Dsu": {
"prefix": "Class_Dsu",
"body": [
"",
"class Dsu {",
" public:",
"",
" vll fa, num;",
"",
" Dsu(int n) { fa = vll(n + 1), num = vll(n + 1); }",
" int find(int x) {",
" if (!fa[x]) return x;",
" return fa[x] = find(fa[x]);",
" }",
"",
" bool Dunion(int p, int q) {",
" int v = find(p), u = find(q);",
" if (v == u) return 0;",
" fa[u] = v;",
" num[v] += num[u];",
" num[u] = num[v];",
" return 1;",
" }",
" ",
"};",
"",
"ll num(int x) { return num[find(x)]; }",
""
]
},
"class_Stmap": {
"prefix": "Class_StMap",
"body": [
"",
"class st_map {",
" public:",
" st_map() {}",
" st_map(vll v) {",
" this->n = v.size(), this->a = v;",
" this->st = vector<array<ll, 31>>(n + 1);",
" st_init();",
" }",
" int query(int l, int r) {",
" int len = r - l + 1;",
" int k = log(len) / log(2);",
" return max(st[l][k], st[r - (1 << k) + 1][k]);",
" }",
"",
" private:",
" int n;",
" vll a;",
" vector<array<ll, 31>> st;",
" void st_init() {",
" for (int j = 0; j <= 17; j++) {",
" for (int i = 1; i + (1 << j) - 1 <= n; i++) {",
" if (j == 0)",
" st[i][j] = a[i];",
" else",
" st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);",
" }",
" }",
" }",
"};",
""
]
},
"Class_HJT_tree": {
"prefix": "Class_HJT_tree",
"body": [
"",
"template <class T>",
"class HJT_tree {",
" //处理数据默认下标从1开始",
" public:",
" //构造函数",
" HJT_tree() {}",
" HJT_tree(vector<T> v) {",
" base = v, this->n = base.size() - 1;",
" tree = vector<node>(n * 32), root.push_back(build(1, n));",
" }",
"",
" void updata(int v, int x, T value) {",
" //插入函数(版本,修改位置,修改值)",
" root.push_back(insert(root[v], 1, n, x, value));",
" }",
"",
" T query(int v, int x) {",
" //查询函数(版本,查询位置)",
" return get_se(root[v], 1, n, x, x);",
" }",
"",
" T query(int v, int l, int r) {",
" //查询函数(版本,查询区间)",
" return get_se(root[v], 1, n, l, r);",
" }",
"",
" private:",
" vi root;",
" vector<T> base;",
" int n, idx = 0;",
" struct node {",
" int l, r;",
" T data;",
" };",
" vector<node> tree;",
" void pushup(int q) { tree[q].data = op(tree[q].l, tree[q].r); }",
" T op(int l, int r) { return max(tree[l].data, tree[r].data); }",
" T e() { return -inf; }",
" int build(int l, int r) {",
" int now = ++idx, mid = l + r >> 1;",
" if (l != r)",
" tree[now].l = build(l, mid), tree[now].r = build(mid + 1, r), pushup(now);",
" return now;",
" }",
" int insert(int old, int l, int r, int x, int value) {",
" int now = ++idx, mid = l + r >> 1;",
" tree[now] = tree[old];",
" if (l == r)",
" tree[now].data = value;",
" else {",
" if (x <= mid)",
" tree[now].l = insert(tree[old].l, l, mid, x, value);",
" else",
" tree[now].r = insert(tree[old].r, mid + 1, r, x, value);",
" pushup(now);",
" }",
" return now;",
" }",
" T get_se(int v, int l, int r, int L, int R) {",
" if (L <= l && r <= R) return tree[v].data;",
" ll mid = l + r >> 1;",
" T res = e();",
" if (L <= mid) res = max(res, get_se(tree[v].l, l, mid, L, R));",
" if (R > mid) res = max(res, get_se(tree[v].r, mid + 1, r, L, R));",
" return res;",
" }",
"};",
""
]
}
}

View File

@ -0,0 +1,359 @@
{
"Graph": {
"prefix": "Class_Graph",
"body": [
"",
"template <class T>",
"class Graph {",
" public:",
" struct edge {",
" int next, to;",
" T w;",
" };",
" int n;",
" vector<vector<T>> maps;",
" vector<T> dis;",
" vector<edge> e;",
" vi head, bj;",
" Graph() {}",
"",
" Graph(int n) {",
" this->n = n, this->m = n * (n - 1);",
" head = vi(n + 1, -1), e = vector<edge>(m * 2 + 1);",
" }",
"",
" Graph(int n, int m) {",
" this->n = n, this->m = m, head = vi(n + 1, -1), e = vector<edge>(m * 2 + 1);",
" }",
"",
" void add(int u, int v, T w) {",
" e[cnt].to = v, e[cnt].next = head[u], e[cnt].w = w, head[u] = cnt++;",
" }",
"",
" void add(int u, int v) {",
" e[cnt].to = v, e[cnt].next = head[u], head[u] = cnt++;",
" }",
"",
" private:",
" int m, cnt = 0;",
"};",
"#define e g.e",
"#define head g.head",
"#define maps g.maps",
"#define add g.add",
"",
],
},
"Class_Graph_Dijkstra": {
"prefix": "Class_Graph_Dijkstra",
"body": [
"",
"#define dis g.dis",
"#define bj g.bj",
"ll dijkstra(Graph<ll> g, int st, int en) {",
" dis = vll(g.n + 1, inf),",
" bj = vi(g.n + 1);",
" priority_queue<pll, vector<pll>, greater<pll>> q;",
" dis[st] = 0;",
" q.push({0, st});",
" while (!q.empty()) {",
" int u = q.top().y;",
" q.pop();",
" if (bj[u]) continue;",
" bj[u] = 1;",
" for (int i = head[u]; ~i; i = e[i].next) {",
" int v = e[i].to;",
" if (dis[v] > dis[u] + e[i].w) {",
" dis[v] = dis[u] + e[i].w;",
" q.push({dis[v], v});",
" }",
" }",
" }",
" if (dis[en] != inf)",
" return dis[en];",
" else",
" return -1;",
"}",
"",
],
},
"Class_Graph_SPFA": {
"prefix": "Class_Graph_SPFA",
"body": [
"",
"ll spfa(Graph<ll> g, int st, int en) {",
" vll bj(g.n + 1), dis(g.n + 1, inf), num(g.n + 1);",
" queue<int> q;",
" dis[st] = 0;",
" bj[st] = 1;",
" q.push(st);",
" while (q.size()) {",
" int u = q.front();",
" if (!bj[u]) continue;",
" if (num[u] > g.n + 1) return inf;//判断是否产生负环",
" bj[u] = 0, num[u]++;",
" for (int i = head[u]; ~i; i = e[i].next) {",
" int w = e[i].w, v = e[i].to;",
" if (dis[v] > dis[u] + w) {",
" dis[v] = dis[u] + w;",
" if (!bj[v]) q.push(v);",
" }",
" }",
" }",
" if(dis[en] == inf) return -1;",
" return dis[en];",
"}",
"",
],
},
"Class_Graph_Kurskal": {
"prefix": "Class_Graph_Kurskal",
"body": [
"",
"ll kruskal(Graph<ll> g, Dsu d) {",
" ll res = 0, cnt = 0;",
" sort(e.begin(), e.end());",
" for (auto i : e) {",
" int u = i.u, v = i.v, w = i.w;",
" int q = d.find(i.u), p = d.find(i.v);",
" if (d.Dunion(q, p)) cnt++, res += w;",
" if (cnt == n - 1) break;",
" }",
" return res;",
"}",
"",
],
},
"Class_Graph_Prim": {
"prefix": "Class_Graph_Prim",
"body": []
},
"Class_Graph_TreeDiam": {
"prefix": "Class_Graph_TreeDiam",
"description": "树的直径",
"body": [
"ll TreeDiam(Graph<ll> g) {",
" vll dis1(n + 1), dis2(n + 1), p(n + 1), up(n + 1);",
" function<ll(ll, ll)> dfs = [&](ll u, ll fa) {",
" for (int i = head[u]; ~i; i = e[i].next) {",
" int v = e[i].to, w = 1;",
" if (v == fa) continue;",
" ll x = dfs(v, u) + 1;",
" if (x >= dis1[u])",
" dis2[u] = dis1[u], dis1[u] = x, p[u] = v;",
" else if (x >= dis2[u])",
" dis2[u] = x;",
" }",
" return dis1[u];",
" };",
" function<void(ll, ll)> dfs0 = [&](ll u, ll fa) {",
" for (int i = head[u]; ~i; i = e[i].next) {",
" int v = e[i].to, w = 1;",
" if (v == fa) continue;",
" if (p[u] == v)",
" up[v] = max(dis2[u], up[u]) + w;",
" else",
" up[v] = max(dis1[u], up[u]) + w;",
" dfs0(v, u);",
" }",
" };",
" dfs(1, -1), dfs0(1, -1);",
" ll ans = -1;",
" for (int i = 1; i <= n + m; i++) {",
" if (dis1[i] == dis2[i] && dis1[i] == 0)",
" ans = max(ans, up[i]);",
" else",
" ans = max(ans, max(up[i], dis1[i]));",
" }",
" return ans;",
"}",
]
},
"Class_Graph_SCC": {
"prefix": "Class_Graph_SCC",
"body": [
"",
"class SCC {",
" public:",
" stack<ll> stk;",
" int timestamp = 0, scc_cnt = 0, n, m;",
" vll dfn, low, in_stk, Size, id;",
" Graph<ll> g;",
"",
" SCC() {}",
"",
" SCC(Graph<ll> g) {",
" this->n = g.n, this->m = g.m, this->g = g;",
" dfn = vll(n + 1, 0);",
" low = vll(n + 1, 0);",
" in_stk = vll(n + 1, 0);",
" Size = vll(n + 1, 0);",
" id = vll(n + 1, 0);",
" for (int i = 1; i <= n; i++)",
" if (!dfn[i]) tarjan(i);",
" }",
"",
" void tarjan(int u) {",
" dfn[u] = low[u] = ++timestamp;",
" stk.push(u), in_stk[u] = 1;",
" for (int i = head[u]; ~i; i = e[i].next) {",
" int v = e[i].to;",
" if (!dfn[v]) {",
" tarjan(v);",
" low[u] = min(low[u], low[v]);",
" } else if (in_stk[v])",
" low[u] = min(low[u], dfn[v]);",
" }",
" if (low[u] == dfn[u]) {",
" ++scc_cnt;",
" int v;",
" do {",
" v = stk.top();",
" stk.pop();",
" in_stk[v] = 0;",
" id[v] = scc_cnt;",
" Size[scc_cnt]++;",
" } while (v != u);",
" }",
" return;",
" }",
"};",
"",
],
},
"Class_Graph_Euler": {
"prefix": "Class_Graph_Euler",
"body": [
"",
"vll din, dout;",
"",
"class Euler {",
" public:",
" int n, m;",
" Graph<ll> g;",
" vector<bool> used;",
" vll path;",
" Euler() {}",
" Euler(Graph<ll> g) {",
" this->n = g.n, this->m = g.m, this->g = g;",
" used = vector<bool>(n + 1);",
" }",
"",
" void dfs_u(int u) {",
" //无向图",
" for (long long &i = head[u]; i; i = e[i].next) {",
" long long j = i & 1 ? i + 1 : i - 1;",
" if(used[i]) {",
" i = e[i].next;",
" continue;",
" }",
" used[j] = used[i] = true;",
" int t = i / 2 + 1;",
" dfs_u(e[i].to);",
" path.push_back(t);",
" }",
" }",
"",
" void dfs_o(int u) {",
" // 有向图",
" for (long long &i = head[u]; i; i = e[i].next) {",
" if(used[i]) {",
" i = e[i].next;",
" continue;",
" }",
" used[i] = true;",
" int t = i + 1;",
" dfs_o(e[i].to);",
" path.push_back(t);",
" }",
" }",
"",
"};",
"#define path eu.path",
"",
]
},
"Class_Graph_LCA": {
"prefix": "Class_Graph_LCA",
"body": [
"",
"class LCA {",
" public:",
" int n;",
" vll depth, fa[33];",
"",
" LCA() {}",
" LCA(Graph<ll> g, int root) {",
" n = g.n, depth = vll(n + 1, inf);",
" for (int i = 0; i <= 32; i++) fa[i] = vll(n + 1);",
" bfs(g, root);",
" }",
"",
" void bfs(Graph<ll> g, int root) {",
" depth[0] = 0, depth[root] = 1;",
" queue<int> q;",
" q.push(root);",
" while (q.size()) {",
" auto u = q.front();",
" q.pop();",
" for (int i = head[u]; ~i; i = e[i].next) {",
" int v = e[i].to;",
" if (depth[v] > depth[u] + 1) {",
" depth[v] = depth[u] + 1;",
" q.push(v);",
" fa[0][v] = u;",
" for (int k = 1; k <= 32; k++) fa[k][v] = fa[k - 1][fa[k - 1][v]];",
" }",
" }",
" }",
" }",
"",
" int query(int a, int b) {",
" if (depth[a] < depth[b]) swap(a, b);",
" for (int i = 32; i >= 0; i--)",
" if (depth[fa[i][a]] >= depth[b]) a = fa[i][a];",
" if (a == b) return a;",
" for (int i = 32; i >= 0; i--)",
" if (fa[i][a] != fa[i][b]) a = fa[i][a], b = fa[i][b];",
" return fa[0][a];",
" }",
"};",
"",
],
},
"Class_Graph_erfen": {
"prefix": "Class_Graph_erfen",
"body": [
"",
"class erfen_graph {",
" public:",
" ll res, n;",
" vi match, st;",
" Graph<ll> g;",
" erfen_graph(Graph<ll> g) {",
" this->g = g, this->n = g.n;",
" st = vector<int>(n + 1), match = vector<int>(n + 1);",
" res = 0;",
" for (int i = 1; i <= n; i++) {",
" st = vector<int>(n + 1);",
" if (find(i)) res++;",
" }",
" }",
"",
" bool find(int u) {",
" for (int i = head[u]; ~i; i = e[i].next) {",
" if (!st[e[i].to]) {",
" st[e[i].to] = true;",
" if (!match[e[i].to] || find(match[e[i].to])) {",
" match[e[i].to] = u;",
" return true;",
" }",
" }",
" }",
" return false;",
" }",
"};",
"",
]
}
}

View File

@ -0,0 +1,108 @@
{
"Math_QuickPow": {
"prefix": "Math_QuickPow",
"body": [
"",
"ll quick_Pow(ll a, ll b, ll mod) {",
" // a的b次方模mod",
" ll res = 1, t = a;",
" while (b) {",
" if (b & 1) res = (res * t) % mod;",
" t = t * t % mod;",
" b >>= 1;",
" }",
" return res;",
"}",
"",
],
},
"Math_Fm": {
"prefix": "Math_Fm",
"body": [
"",
"ll quick_Pow(ll a, ll b, ll mod) {",
" // a的b次方模mod",
" ll res = 1, t = a;",
" while (b) {",
" if (b & 1) res = (res * t) % mod;",
" t = t * t % mod;",
" b >>= 1;",
" }",
" return res;",
"}",
"",
"ll Fm(ll a, ll mod) {",
" //费马小定理求逆元",
" return quick_Pow(a, mod - 2, mod);",
"}",
"",
],
},
"Math_C": {
"prefix": "Math_C",
"body": [
"",
"ll quick_Pow(ll a, ll b, ll mod) {",
" // a的b次方模mod",
" ll res = 1, t = a;",
" while (b) {",
" if (b & 1) res = (res * t) % mod;",
" t = t * t % mod;",
" b >>= 1;",
" }",
" return res;",
"}",
"",
"ll Fm(ll a, ll mod) {",
" //费马小定理求逆元",
" return quick_Pow(a, mod - 2, mod);",
"}",
"",
"ll C(ll n, ll m, ll mod) {",
" ll fz = 1, fm = 1;",
" for (ll i = n; i >= n - m + 1; i--) fz = fz * i % mod;",
" for (ll i = 1; i <= m; i++) fm = fm * i % mod;",
" return (fz * Fm(fm, mod)) % mod;",
"}",
"",
],
},
"Class_Math_Bignum": {
"prefix": "Class_Math_Bignum",
"body": [
"",
"class Math_Bignum {",
" public:",
" string Bignum;",
"",
" vll num;",
"",
" Math_Bignum(string s) {",
" Bignum = s;",
" for (auto i : s) num.push_back(i - '0');",
" }",
"",
" Math_Bignum(vll v) {",
" string s;",
" num = v;",
" for (auto i : v) s.push_back(i + '0');",
" }",
"",
" Math_Bignum(ll l) {",
" string s;",
" while (l) s.push_back(l % 10 + '0'), num.push_back(l % 10), l /= 10;",
" reverse(num.begin(), num.end());",
" reverse(s.begin(), s.end());",
" Bignum = s;",
" }",
"",
" ll get(ll l, ll r) {",
" ll res = 0;",
" for (int i = l - 1; i <= r - 1; i++) res = res * 10 + num[i];",
" return res;",
" }",
"};",
"",
],
},
}