update
This commit is contained in:
parent
5eaf966f21
commit
7c52a3c538
303
snippets/acm/Class_Data.code-snippets
Normal file
303
snippets/acm/Class_Data.code-snippets
Normal 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;",
|
||||||
|
" }",
|
||||||
|
"};",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
359
snippets/acm/Class_Graph.code-snippets
Normal file
359
snippets/acm/Class_Graph.code-snippets
Normal 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;",
|
||||||
|
" }",
|
||||||
|
"};",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
108
snippets/acm/Class_Math.code-snippets
Normal file
108
snippets/acm/Class_Math.code-snippets
Normal 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;",
|
||||||
|
" }",
|
||||||
|
"};",
|
||||||
|
"",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user