From 8e1787eaab9ae029db5bd2310d6b72b05bf1da7a Mon Sep 17 00:00:00 2001 From: fmkiotheka <fmkiotheka@inf.ufpr.br> Date: Sun, 15 Oct 2023 23:04:09 -0300 Subject: [PATCH] =?UTF-8?q?Melhora=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/2-sat.h | 4 +- fontes/aho-corasick.h | 4 +- fontes/angular-sweep.h | 4 +- fontes/chinese-remainder-theorem.h | 3 +- fontes/coordinate-compression.h | 2 +- fontes/dijkstra.h | 21 +++-- fontes/dinic.h | 6 +- fontes/eulerian-path.h | 5 +- fontes/ford-fulkerson-edmons-karp-min-cost.h | 4 +- fontes/ford-fulkerson-edmons-karp.h | 4 +- fontes/gauss.h | 3 +- .../generalized-chinese-remainder-theorem.h | 4 +- fontes/graham.h | 8 +- fontes/hash.sh | 2 +- fontes/interval-set.h | 6 +- fontes/karatsuba.h | 22 ++--- fontes/kd-tree.h | 32 ++++---- fontes/kosaraju.h | 32 ++++---- fontes/kruskal.h | 28 +++---- fontes/lca-offline.h | 3 +- fontes/mean-median.h | 12 +-- fontes/merge-sort.h | 2 +- fontes/mex.h | 6 +- fontes/miller-rabin.h | 8 +- fontes/mo-algorithm.h | 2 +- fontes/monotone.h | 4 +- fontes/next-combination.h | 4 +- fontes/numbers.h | 5 +- fontes/optimal-schedule-jobs.h | 4 +- fontes/parquet.h | 2 +- fontes/point-in-polygon.h | 2 +- fontes/polygon-lattice-points.h | 9 +-- fontes/prim.h | 2 +- fontes/remove-deque.h | 2 +- fontes/segment.h | 2 +- fontes/sieve.h | 4 +- fontes/sparse-table.h | 6 +- fontes/spfa.h | 27 +++---- fontes/stable-matching.h | 18 ++--- fontes/stoer-wagner.h | 17 ++-- fontes/suffix-array-radix.h | 4 +- fontes/suffix-array.h | 4 +- fontes/suffix-automaton.h | 2 +- fontes/suffix-tree.h | 81 +++++++++---------- fontes/topological-order.h | 2 +- fontes/tree-square-root-decomposition.h | 36 ++++----- fontes/trie.h | 4 +- 47 files changed, 228 insertions(+), 240 deletions(-) diff --git a/fontes/2-sat.h b/fontes/2-sat.h index fb0be41..013e40f 100644 --- a/fontes/2-sat.h +++ b/fontes/2-sat.h @@ -28,10 +28,10 @@ int solve2sat(int n) { } for (int u = 0; u < n; u++) { if (rep[2*u] == rep[2*u+1]) - return false; + return 0; val[u] = rep[2*u] > rep[2*u+1]; } - return true; + return 1; } void add_implies(int a, bool na, int b, bool nb) { diff --git a/fontes/aho-corasick.h b/fontes/aho-corasick.h index 3bde3c3..595163e 100644 --- a/fontes/aho-corasick.h +++ b/fontes/aho-corasick.h @@ -3,7 +3,7 @@ struct node { vector<int> nxt, go, ix; node() : p (0), pc (0), depth (-1), lnk (-1), out (-1), occ (0), - leaf (false), nxt (S, -1), go (S, -1) {} + leaf (0), nxt (S, -1), go (S, -1) {} }; vector<node> aca (1); @@ -18,7 +18,7 @@ void ins(string ne, int ix) { } u = aca[u].nxt[ch]; } - aca[u].leaf = true; + aca[u].leaf = 1; aca[u].ix.push_back(ix); } diff --git a/fontes/angular-sweep.h b/fontes/angular-sweep.h index 99a7566..b036af5 100644 --- a/fontes/angular-sweep.h +++ b/fontes/angular-sweep.h @@ -2,13 +2,13 @@ int get_points_inside(int i, double r, int n) { vector<double> ang; for (int j = 0; j < n; j++) if (i != j && d[i][j] <= 2*r) { - double a = atan2(p[j].py - p[i].py, p[j].px - p[i].px); + double a = atan2(p[j].py-p[i].py, p[j].px-p[i].px); double b = acos(d[i][j]/(2*r)); ang.push_back(dbi(a - b, j)); ang.push_back(dbi(a + b, j)); } - sort(ang.begin(), ang.end()); + sort(begin(ang), end(ang)); int count = 1, res = 1; for (auto angle : ang) { diff --git a/fontes/chinese-remainder-theorem.h b/fontes/chinese-remainder-theorem.h index 266a3a2..958010d 100644 --- a/fontes/chinese-remainder-theorem.h +++ b/fontes/chinese-remainder-theorem.h @@ -3,7 +3,8 @@ ll crt(vector<ll> a, vector<ll> m, int t) { ll ans = 0; for (int i = 0; i < t; i++) { ll pp = p / m[i]; - ans = (ans + ((a[i] * inv(pp, m[i])) % p * pp) % p) % p; + ans += ((a[i] * inv(pp, m[i])) % p * pp) % p; + ans %= p; } return ans; } diff --git a/fontes/coordinate-compression.h b/fontes/coordinate-compression.h index 2629931..f4202db 100644 --- a/fontes/coordinate-compression.h +++ b/fontes/coordinate-compression.h @@ -1,5 +1,5 @@ void compress(vector<int>& v, vector<int>& cv) { - set<int> vs (v.begin(), v.end()); + set<int> vs (begin(v), end(v)); map<int, int> to, fm; int ix = 0; for (int i : vs) { to[i] = ix; fm[ix] = i; ix++; } diff --git a/fontes/dijkstra.h b/fontes/dijkstra.h index 8ebebe1..efa8912 100644 --- a/fontes/dijkstra.h +++ b/fontes/dijkstra.h @@ -1,23 +1,20 @@ -vector<ll> d (N); vector<bool> vis (N); -vector<vector<int>> dag (N); - -void dijkstra(int src, int dest) { - fill(d.begin(), d.end(), oo); - fill(vis.begin(), vis.end(), false); - priority_queue<ii, vector<ii>, greater<ii>> Q; +void dijkstra(int src, int dest, int n) { + vector<ll> d (n, oo); vector<bool> vis (n); + vector<vector<int>> dag (n); + priority_queue<ii, vector<ii>, greater<ii>> q; d[src] = 0; - Q.push({0, src}); - while (!Q.empty()) { - auto [c, u] = Q.top(); Q.pop(); + q.push({0, src}); + while (!q.empty()) { + auto [c, u] = q.top(); q.pop(); if (vis[u]) { continue; } - vis[u] = true; + vis[u] = 1; for (auto [v, w] : gt[u]) if (d[u] == d[v] + w) dag[v].push_back(u); if (u == dest) { break; } for (auto [v, w] : g[u]) if (d[v] > d[u] + w) { d[v] = d[u] + w; - Q.push({d[v], v}); + q.push({d[v], v}); } } } diff --git a/fontes/dinic.h b/fontes/dinic.h index 2bda29f..bc9a9ef 100644 --- a/fontes/dinic.h +++ b/fontes/dinic.h @@ -33,7 +33,8 @@ ll dfs(int u, int t, ll pushed) { int v = edges[i].v; if (level[u] + 1 != level[v]) { continue; } if (edges[i].cap - edges[i].flow < 1) { continue; } - ll tr = dfs(v, t, min(pushed, edges[i].cap - edges[i].flow)); + ll tr = dfs(v, t, + min(pushed, edges[i].cap - edges[i].flow)); if (tr == 0) { continue; } edges[i].flow += tr; edges[i^1].flow -= tr; @@ -49,7 +50,8 @@ ll dinic /* O(EV^2) */(int s, int t) { level[s] = 0; q.push(s); if (!minimum_path(s, t)) { break; } fill(begin(ptr), end(ptr), 0); - while (ll pushed = dfs(s, t, oo)) { max_flow += pushed; } + while (ll pushed = dfs(s, t, oo)) + max_flow += pushed; } return max_flow; } diff --git a/fontes/eulerian-path.h b/fontes/eulerian-path.h index c25c3fa..f46d207 100644 --- a/fontes/eulerian-path.h +++ b/fontes/eulerian-path.h @@ -1,5 +1,6 @@ vector<int> eulerian_path(int src, int n) { - for (int u = 0; u < n; u++) if (deg[u] % 2) { return {}; } + for (int u = 0; u < n; u++) + if (deg[u] % 2) { return {}; } stack<int> st; st.push(src); vector<int> res; while (!st.empty()) { @@ -15,6 +16,6 @@ vector<int> eulerian_path(int src, int n) { } } for (int u = 0; u < n; u++) if (g[u].size()) { return {}; } - reverse(res.begin(), res.end()); + reverse(begin(res), end(res)); return res; } diff --git a/fontes/ford-fulkerson-edmons-karp-min-cost.h b/fontes/ford-fulkerson-edmons-karp-min-cost.h index 5490dd1..8430ead 100644 --- a/fontes/ford-fulkerson-edmons-karp-min-cost.h +++ b/fontes/ford-fulkerson-edmons-karp-min-cost.h @@ -11,8 +11,8 @@ void link(int u, int v, int cap, int cost) { } bool minimum_path(int s, int t) { - fill(dist.begin(), dist.end(), oo); dist[s] = 0; - queue<int> q; q.push(s); + fill(begin(dist), end(dist), oo); + queue<int> q; q.push(s); dist[s] = 0; while (!q.empty()) { int u = q.front(); q.pop(); queu[u] = 0; diff --git a/fontes/ford-fulkerson-edmons-karp.h b/fontes/ford-fulkerson-edmons-karp.h index a811d8a..23a22d7 100644 --- a/fontes/ford-fulkerson-edmons-karp.h +++ b/fontes/ford-fulkerson-edmons-karp.h @@ -9,8 +9,8 @@ void link(int u, int v, int c) { } bool minimum_path(int s, int t) { - fill(dist.begin(), dist.end(), oo); dist[s] = 0; - queue<int> q; q.push(s); + fill(begin(dist), end(dist), oo); + queue<int> q; q.push(s); dist[s] = 0; while (!q.empty()) { int u = q.front(); q.pop(); if (u == t) { break; } diff --git a/fontes/gauss.h b/fontes/gauss.h index b33a322..2abfb8c 100644 --- a/fontes/gauss.h +++ b/fontes/gauss.h @@ -1,5 +1,6 @@ template<typename T> -pair<int, vector<T>> gauss(vector<vector<T>> a, vector<T> b) { +pair<int, vector<T>> gauss( + vector<vector<T>> a, vector<T> b) { const double eps = 1e-6; int n = a.size(), m = a[0].size(); for (int i = 0; i < n; i++) a[i].push_back(b[i]); diff --git a/fontes/generalized-chinese-remainder-theorem.h b/fontes/generalized-chinese-remainder-theorem.h index d097994..6fb5fc5 100644 --- a/fontes/generalized-chinese-remainder-theorem.h +++ b/fontes/generalized-chinese-remainder-theorem.h @@ -1,4 +1,6 @@ -ll norm(ll a, ll b) { a %= b; return (a < 0) ? a + b : a; } +ll norm(ll a, ll b) { + a %= b; return (a < 0) ? a + b : a; +} pair<ll, ll> crt_single(ll a, ll n, ll b, ll m) { ll x, y; ll g = extgcd(n, m, x, y); diff --git a/fontes/graham.h b/fontes/graham.h index 5c488d1..b204e5c 100644 --- a/fontes/graham.h +++ b/fontes/graham.h @@ -1,8 +1,8 @@ -vector<pt> convex_hull(vector<pt>& ps, bool col = false) { - pt p0 = *min_element(ps.begin(), ps.end(), [](pt a, pt b) { +vector<pt> convex_hull(vector<pt>& ps, bool col = 0) { + pt p0 = *min_element(begin(ps), end(ps), [](pt a, pt b) { return make_pair(a.py, a.px) < make_pair(b.py, b.px); }); - sort(ps.begin(), ps.end(), [&p0](pt a, pt b) { + sort(begin(ps), end(ps), [&p0](pt a, pt b) { int o = seg_ornt(p0, a, b); return o < 0 || (o == 0 && norm(p0 - a) < norm(p0 - b)); }); @@ -10,7 +10,7 @@ vector<pt> convex_hull(vector<pt>& ps, bool col = false) { int i = ps.size(); i--; while (i >= 0 && seg_ornt(p0, ps[i], ps.back()) == 0) i--; - reverse(ps.begin()+i+1, ps.end()); + reverse(begin(ps)+i+1, end(ps)); } vector<pt> ans; for (int i = 0; i < ps.size(); i++) { while (ans.size() > 1 && !ccw( diff --git a/fontes/hash.sh b/fontes/hash.sh index 0e1e9cb..3990611 100644 --- a/fontes/hash.sh +++ b/fontes/hash.sh @@ -1,2 +1,2 @@ sed -n $2','$3' p' $1 | sed '/^#w/d' | cpp -dD -P \ - -fpreprocessed | tr -d '[:space:]' | md5sum | cut -c -6 + -fpreprocessed | tr -d '[:space:]' | md5sum | cut -c -3 diff --git a/fontes/interval-set.h b/fontes/interval-set.h index c723497..818d3a7 100644 --- a/fontes/interval-set.h +++ b/fontes/interval-set.h @@ -12,12 +12,12 @@ set<itvl, less<>> si; void ins_in(itvl in) { auto it = si.lower_bound(in); int a = in.a, b = in.b, c = in.c; - if (si.size() > 0 && it != si.begin() + if (si.size() > 0 && it != begin(si) && prev(it)->b+1 == a && prev(it)->c == c) { auto prv = prev(it); int prva = prv->a; si.erase(prv); a = prva; } - if (it != si.end() && c == it->c && b+1 == it->a) { + if (it != end(si) && c == it->c && b+1 == it->a) { int nxtb = it->b; si.erase(it); b = nxtb; } si.insert(itvl(a, b, c)); @@ -25,7 +25,7 @@ void ins_in(itvl in) { void upd_color(int a, int b, int c) { auto it = si.lower_bound(b); - if (it != si.end()) { + if (it != end(si)) { itvl ori = *it; si.erase(it); if (ori.a < a) { ins_in(itvl(ori.a, a-1, v)); } if (ori.b > b) { ins_in(itvl(b+1, ori.b, v)); } diff --git a/fontes/karatsuba.h b/fontes/karatsuba.h index cb0e33b..b9b60e4 100644 --- a/fontes/karatsuba.h +++ b/fontes/karatsuba.h @@ -9,19 +9,19 @@ vector<ll> karatsuba(const vector<ll> &a, return res; } int k = n >> 1; - vector<ll> a1(a.begin(), a.begin() + k); - vector<ll> a2(a.begin() + k, a.end()); - vector<ll> b1(b.begin(), b.begin() + k); - vector<ll> b2(b.begin() + k, b.end()); + vector<ll> a1(begin(a), begin(a)+k); + vector<ll> a2(begin(a)+k, end(a)); + vector<ll> b1(begin(b), begin(b)+k); + vector<ll> b2(begin(b)+k, end(b)); vector<ll> a1b1 = karatsuba(a1, b1); vector<ll> a2b2 = karatsuba(a2, b2); - for (int i = 0; i < k; i++) a2[i] += a1[i]; - for (int i = 0; i < k; i++) b2[i] += b1[i]; + for (int i=0; i < k; i++) a2[i] += a1[i]; + for (int i=0; i < k; i++) b2[i] += b1[i]; vector<ll> r = karatsuba(a2, b2); - for (int i = 0; i < a1b1.size(); i++) r[i] -= a1b1[i]; - for (int i = 0; i < a2b2.size(); i++) r[i] -= a2b2[i]; - for (int i = 0; i < r.size(); i++) res[i+k] += r[i]; - for (int i = 0; i < a1b1.size(); i++) res[i] += a1b1[i]; - for (int i = 0; i < a2b2.size(); i++) res[i+n] += a2b2[i]; + for (int i=0; i < a1b1.size(); i++) r[i] -= a1b1[i]; + for (int i=0; i < a2b2.size(); i++) r[i] -= a2b2[i]; + for (int i=0; i < r.size(); i++) res[i+k] += r[i]; + for (int i=0; i < a1b1.size(); i++) res[i] += a1b1[i]; + for (int i=0; i < a2b2.size(); i++) res[i+n] += a2b2[i]; return res; } diff --git a/fontes/kd-tree.h b/fontes/kd-tree.h index 469eec8..ec3db72 100644 --- a/fontes/kd-tree.h +++ b/fontes/kd-tree.h @@ -9,12 +9,12 @@ struct kdtree { double dist_sq(const pt& o) { return norm(o - p); } pt p; node* left, *right; }; - node* root = nullptr; + node* root = 0; vector<double> best; vector<node> t; - struct node_cmp { - node_cmp(size_t _index) : ix(_index) {} + struct cmp { + cmp(size_t _index) : ix(_index) {} bool operator()(const node& n1, const node& n2) { return get_ii(n1.p, ix) < get_ii(n2.p, ix); } @@ -22,10 +22,9 @@ struct kdtree { }; node* make_tree(size_t begin, size_t end, size_t ix) { - if (end <= begin) - return nullptr; + if (end <= begin) { return 0; } size_t n = begin + (end - begin)/2; - nth_element(&t[begin], &t[n], &t[0] + end, node_cmp(ix)); + nth_element(&t[begin], &t[n], &t[0] + end, cmp(ix)); ix = (ix + 1) % 2; t[n].left = make_tree(begin, n, ix); t[n].right = make_tree(n + 1, end, ix); @@ -36,30 +35,27 @@ struct kdtree { if (r == nullptr) return; double d = r->dist_sq(p); - if (best.size() < k || d < best[best.size()-1]) { + if (best.size() < k || d < best.back()) { best.push_back(d); - sort(best.begin(), best.end()); + sort(begin(best), end(best)); if (best.size() > k) - best.erase(best.begin() + k, best.end()); + best.erase(begin(best)+k, end(best)); } - if (best.size() == 0) - return; + if (best.size() == 0) { return; } double dx = get_ii(r->p, ix) - get_ii(p, ix); ix = (ix + 1) % 2; nearest_k(dx > 0 ? r->left : r->right, p, ix, k); - if (dx * dx >= best[best.size()-1]) - return; + if (dx * dx >= best[best.size()-1]) { return; } nearest_k(dx > 0 ? r->right : r->left, p, ix, k); } template<typename iterator> - kdtree(iterator begin, iterator end) : t(begin, end) { - root = make_tree(0, t.size(), 0); - } + kdtree(iterator begin, iterator end) : t(begin, end) { + root = make_tree(0, t.size(), 0); + } double nearest_k(const pt& p, int k) { - if (root == nullptr) - throw logic_error("tree is empty"); + if (root == 0) { throw logic_error("empty tree"); } best.clear(); nearest_k(root, p, 0, k); double acc = 0; diff --git a/fontes/kosaraju.h b/fontes/kosaraju.h index 6ca7baa..1a4d62a 100644 --- a/fontes/kosaraju.h +++ b/fontes/kosaraju.h @@ -3,26 +3,26 @@ vector<int> vis (N), rep (N); stack<int> sinks; void fill_stack(int u) { - if (vis[u] == cts) { return; } - vis[u] = cts; - for (int v : g_t[u]) { fill_stack(v); } - sinks.push(u); + if (vis[u] == cts) { return; } + vis[u] = cts; + for (int v : g_t[u]) { fill_stack(v); } + sinks.push(u); } void mark_component(int u, int r) { - if (vis[u] == cts) { return; } - vis[u] = cts; rep[u] = r; - for (int v : g[u]) { mark_component(v, r); } + if (vis[u] == cts) { return; } + vis[u] = cts; rep[u] = r; + for (int v : g[u]) { mark_component(v, r); } } stack<int> kosaraju(int n) { - for (int u = 0; u < n; u++) { fill_stack(u); } - cts++; - stack<int> topo; - while (!sinks.empty()) { - int u = sinks.top(); sinks.pop(); - mark_component(u, u); - if (rep[u] == u) topo.push(u); - } - return topo; + for (int u = 0; u < n; u++) { fill_stack(u); } + cts++; + stack<int> topo; + while (!sinks.empty()) { + int u = sinks.top(); sinks.pop(); + mark_component(u, u); + if (rep[u] == u) topo.push(u); + } + return topo; } diff --git a/fontes/kruskal.h b/fontes/kruskal.h index 37b3bb4..7d0c55b 100644 --- a/fontes/kruskal.h +++ b/fontes/kruskal.h @@ -1,20 +1,20 @@ struct edge { - int u, v, w; - bool operator<(struct edge &o) { return w < o.w; } + int u, v, w; + bool operator<(struct edge &o) { return w < o.w; } }; int kruskal(int n) { - sort(edges.begin(), edges.end()); - ds_init(n); - int components = n; - ll sum = 0; - for (auto [u, v, w] : edges) { - if (components == 1) { break; } - if (ds_find(u) != ds_find(v)) { - ds_union(u, v); - components--; - sum += w; - } + sort(begin(edges), end(edges)); + ds_init(n); + int components = n; + ll sum = 0; + for (auto [u, v, w] : edges) { + if (components == 1) { break; } + if (ds_find(u) != ds_find(v)) { + ds_union(u, v); + components--; + sum += w; } - return sum; + } + return sum; } diff --git a/fontes/lca-offline.h b/fontes/lca-offline.h index ee011d3..5f00b8e 100644 --- a/fontes/lca-offline.h +++ b/fontes/lca-offline.h @@ -2,8 +2,7 @@ vector<vector<int>> queries (N); vector<int> anc (N); vector<bool> vis (N); void dfs(int u) { - vis[u] = true; - anc[u] = u; + vis[u] = 1; anc[u] = u; for (int v : adj[u]) if (!vis[v]) { dfs(v); ds_unite(u, v); diff --git a/fontes/mean-median.h b/fontes/mean-median.h index fe0a4de..e92d510 100644 --- a/fontes/mean-median.h +++ b/fontes/mean-median.h @@ -14,8 +14,10 @@ void get_mean_med(vector<int> a) { for (int it = 0; it < 100; it++) { double mi = (lo+hi)/2; vector<double> b (n); - for (int i = 0; i < n; i++) { b[i] = a[i] - mi; } - if (solve(mi, b) >= 0) { lo = mi; } else { hi = mi; } + for (int i = 0; i < n; i++) + b[i] = a[i] - mi; + if (solve(mi, b) >= 0) { lo = mi; } + else { hi = mi; } } mean = lo; } @@ -24,10 +26,10 @@ void get_mean_med(vector<int> a) { for (int it = 0; it < 100; it++) { double mi = (lo+hi)/2; vector<double> b (n); - for (int i = 0; i < n; i++) { + for (int i = 0; i < n; i++) b[i] = (a[i] >= mi) ? +1 : -1; - } - if (solve(mi, b) > 0) { lo = mi; } else { hi = mi; } + if (solve(mi, b) > 0) { lo = mi; } + else { hi = mi; } } med = lo; } diff --git a/fontes/merge-sort.h b/fontes/merge-sort.h index b13da7a..fedf3dc 100644 --- a/fontes/merge-sort.h +++ b/fontes/merge-sort.h @@ -13,5 +13,5 @@ void merge_sort(int l, int r) { } else if (i < mi) { aux[k] = a[i++]; } else { aux[k] = a[j++]; } } - copy(aux.begin(), aux.end(), a.begin()+l); + copy(begin(aux), end(aux), begin(a)+l); } diff --git a/fontes/mex.h b/fontes/mex.h index 081bf29..a9fc527 100644 --- a/fontes/mex.h +++ b/fontes/mex.h @@ -1,10 +1,12 @@ struct mex { vector<bool> tomex; int gt = 0; mex(int n) : tomex(n) {}; - void insert_mex(int x) { tomex[x] = 1; gt = max(gt, x); } + void insert_mex(int x) { + tomex[x] = 1; gt = max(gt, x); + } int get_reset_mex() { int m; for (m = 0; tomex[m]; m++); - fill(tomex.begin(), tomex.begin()+gt+1, 0); + fill(begin(tomex), begin(tomex)+gt+1, 0); return m; } }; diff --git a/fontes/miller-rabin.h b/fontes/miller-rabin.h index e14a420..eb9711a 100644 --- a/fontes/miller-rabin.h +++ b/fontes/miller-rabin.h @@ -11,15 +11,15 @@ ll binary_pow(ll a, ll e, ll m) { vector<int> witnesses = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 }; bool is_prime(ll n) { - if (n < 2) { return false; } + if (n < 2) { return 0; } int s = __lg((n-1)&-(n-1)); ll d = n >> s; for (int a : witnesses) { - if (n == a) { return true; } + if (n == a) { return 1; } ll p = binary_pow(a, d, n), i = s; while (p != 1 && p != n - 1 && a % n && i--) p = (i128)p * p % n; - if (p != n - 1 && i != s) { return false; } + if (p != n - 1 && i != s) { return 0; } } - return true; + return 1; } diff --git a/fontes/mo-algorithm.h b/fontes/mo-algorithm.h index 6bae8ad..b49ee49 100644 --- a/fontes/mo-algorithm.h +++ b/fontes/mo-algorithm.h @@ -1,6 +1,6 @@ vector<int> mo(vector<qry> qs) { vector<int> ans (qs.size()); - sort(qs.begin(), qs.end(), [](qry a, qry b) { + sort(begin(qs), end(qs), [](qry a, qry b) { if (a.l/B != b.l/B) { return a.l < b.l; } return ((a.l/B) % 2 == 0) ^ (a.r < b.r); }); diff --git a/fontes/monotone.h b/fontes/monotone.h index 3e9769b..e73b3f0 100644 --- a/fontes/monotone.h +++ b/fontes/monotone.h @@ -1,6 +1,6 @@ -vector<pt> convex_hull(vector<pt>& ps, bool col = false) { +vector<pt> convex_hull(vector<pt>& ps, bool col = 0) { int k = 0, n = ps.size(); vector<pt> ans (2*n); - sort(ps.begin(), ps.end(), [](pt a, pt b) { + sort(begin(ps), end(ps), [](pt a, pt b) { return make_pair(a.px, a.py) < make_pair(b.px, b.py); }); for (int i = 0; i < n; i++) { diff --git a/fontes/next-combination.h b/fontes/next-combination.h index fde88a7..1665b46 100644 --- a/fontes/next-combination.h +++ b/fontes/next-combination.h @@ -1,9 +1,9 @@ bool next_combination(vector<int>& a, int n) { int k = a.size(); - for (int i = k - 1; i >= 0; i--) if (a[i] < n - k + i + 1) { + for (int i = k-1; i >= 0; i--) if (a[i] <= n-k+i) { a[i]++; for (int j = i + 1; j < k; j++) - a[j] = a[j - 1] + 1; + a[j] = a[j-1] + 1; return 1; } return 0; diff --git a/fontes/numbers.h b/fontes/numbers.h index f9cd80a..f29ff4c 100644 --- a/fontes/numbers.h +++ b/fontes/numbers.h @@ -1,4 +1,5 @@ -ll clamp(ll x, ll lo, ll hi) { return min(hi, max(x, lo)); } +ll clamp(ll x, ll lo, ll hi) { + return min(hi, max(x, lo)); } int msb(ll i) { return i ? __lg(i)+1 : 0; } int lsb(ll i) { return msb(i&-i); } ll equals_zero_mod_m_inclusive(ll a, ll b, ll m) { @@ -8,6 +9,6 @@ ll multiples_inclusive(ll a, ll b, ll x) { ll ceil_div(ll x, ll y) { return (x/y) + bool(x%y); } ll round_div(ll x, ll y) { return (x+y/2)/y; } ll mulll(ll a, ll b, ll m) { // a * b % m - ll ret = a * b - ll((long double) 1/m * a * b + 0.5) * m; + ll ret = a*b - ll((long double)1/m*a*b + 0.5) * m; return ret < 0 ? ret + m : ret; } diff --git a/fontes/optimal-schedule-jobs.h b/fontes/optimal-schedule-jobs.h index 23a7d3e..b8165b1 100644 --- a/fontes/optimal-schedule-jobs.h +++ b/fontes/optimal-schedule-jobs.h @@ -4,13 +4,13 @@ struct job { }; vector<int> compute_schedule(vector<job> jobs) { - sort(jobs.begin(), jobs.end()); + sort(begin(jobs), end(jobs)); set<pair<int,int>> s; vector<int> schedule; for (int i = jobs.size()-1; i >= 0; i--) { int t = jobs[i].dl - (i ? jobs[i-1].dl : 0); s.insert(make_pair(jobs[i].duration, jobs[i].idx)); while (t && !s.empty()) { - auto it = s.begin(); + auto it = begin(s); if (it->first <= t) { t -= it->first; schedule.push_back(it->second); diff --git a/fontes/parquet.h b/fontes/parquet.h index 22494cf..6c74613 100644 --- a/fontes/parquet.h +++ b/fontes/parquet.h @@ -1,6 +1,6 @@ vector<vector<ll>> dp (N+1, vector<ll>(1LL<<M)); -void calc(int x = 0, int y = 0, int s = 0, int nxts = 0) { +void calc(int x=0, int y=0, int s=0, int nxts=0) { if (x == n) { return; } if (y >= m) { dp[x+1][nxts] += dp[x][s]; return; } int cs = 1 << y; diff --git a/fontes/point-in-polygon.h b/fontes/point-in-polygon.h index 2d34a1b..6848188 100644 --- a/fontes/point-in-polygon.h +++ b/fontes/point-in-polygon.h @@ -1,6 +1,6 @@ int is_inside_poly(vector<pt>& ps, pt p, int strict) { int n = ps.size(); - if (n < 3) { return false; } + if (n < 3) { return 0; } int count = 0; for (int i = 0; i < n; i++) { int j = (i+1)%n; diff --git a/fontes/polygon-lattice-points.h b/fontes/polygon-lattice-points.h index 14bc9a0..efc2cd3 100644 --- a/fontes/polygon-lattice-points.h +++ b/fontes/polygon-lattice-points.h @@ -2,12 +2,9 @@ ll lattice_points(vector<pt>& ps) { ll b = 0; for (int i = 0; i < n; i++) { pt v = vec(ps[i], ps[(i+1)%n]); - if (v.py == 0) - b += abs(v.px); - else if (v.px == 0) - b += abs(v.py); - else - b += gcd(abs(v.px), abs(v.py)); + if (v.py == 0) { b += abs(v.px); } + else if (v.px == 0) { b += abs(v.py); } + else { b += gcd(abs(v.px), abs(v.py)); } } return poly_area(ps) - b/2 + 1; } diff --git a/fontes/prim.h b/fontes/prim.h index 7c8431a..806f81e 100644 --- a/fontes/prim.h +++ b/fontes/prim.h @@ -10,7 +10,7 @@ ll prim(int src) { while (!Q.empty()) { auto [c, u] = Q.top(); Q.pop(); if (vis[u]) { continue; } - vis[u] = true; + vis[u] = 1; if (par[u] != -1) { int v = par[u]; ll w = d[u]; pt[u].push_back(ii(v, w)); diff --git a/fontes/remove-deque.h b/fontes/remove-deque.h index 68394aa..f9a4b4c 100644 --- a/fontes/remove-deque.h +++ b/fontes/remove-deque.h @@ -5,7 +5,7 @@ vector<int> remove(vector<int>& v, vector<int>& r) { for (int i = 0; i < n; i++) l[i/B].push_back(v[i]); for (int i : r) { - auto it = l[i/B].begin()+(i%B); + auto it = begin(l[i/B])+(i%B); ans.push_back(*it); l[i/B].erase(it); int bi = i/B; while (l[bi+1].size() > 0) { diff --git a/fontes/segment.h b/fontes/segment.h index 76171c0..10bffdb 100644 --- a/fontes/segment.h +++ b/fontes/segment.h @@ -3,5 +3,5 @@ using seg = pair<pt, pt>; pt vec(seg s) { return vec(s.aa, s.bb); } int ord_ornt(seg s, pt c) { - return seg_ornt(s.aa, s.bb, c); + return seg_ornt(s.aa, s.bb, c); } diff --git a/fontes/sieve.h b/fontes/sieve.h index 470673b..31440de 100644 --- a/fontes/sieve.h +++ b/fontes/sieve.h @@ -1,6 +1,6 @@ -vector<bool> sieve (1e7+15, true); +vector<bool> sieve (1e7+15, 1); void eratosthenes(int n) { for (int i = 2; i * i <= n; i++) if (sieve[i]) for (int j = i * i; j <= n; j += i) - sieve[j] = false; + sieve[j] = 0; } diff --git a/fontes/sparse-table.h b/fontes/sparse-table.h index cf932ba..c54a2a8 100644 --- a/fontes/sparse-table.h +++ b/fontes/sparse-table.h @@ -10,10 +10,10 @@ void build(vector<int>& src) { for (int j = 1; j <= K; j++) for (int i = 0; i + (1 << j) <= N; i++) - st[i][j] = min(st[i][j-1], st[i + (1 << (j - 1))][j - 1]); + st[i][j] = min(st[i][j-1], st[i+(1 << (j-1))][j-1]); } int min_inclusive(int l, int r) { - int j = lg[r - l + 1]; - return min(st[l][j], st[r - (1 << j) + 1][j]); + int j = lg[r-l+1]; + return min(st[l][j], st[r-(1 << j)+1][j]); } diff --git a/fontes/spfa.h b/fontes/spfa.h index 6baf3c7..de88162 100644 --- a/fontes/spfa.h +++ b/fontes/spfa.h @@ -1,27 +1,20 @@ -vector<ll> d (N); vector<bool> queu (N); -vector<int> cnt (N); - bool spfa(int src, int n) { - fill(d.begin(), d.end(), oo); - fill(cnt.begin(), cnt.end(), 0); + vector<int> cnt (n); + vector<bool> queu (n); + vector<ll> d (n, oo); d[src] = 0; queue<int> q; q.push(src); while (!q.empty()) { int u = q.front(); q.pop(); queu[u] = 0; - for (auto [v, w] : g[u]) { - if (d[v] > d[u] + w) { - d[v] = d[u] + w; - if (!queu[v]) { - q.push(v); - queu[v] = 1; - cnt[v]++; - if (cnt[v] > n) - // negative cycle - return false; - } + for (auto [v, w] : g[u]) if (d[v] > d[u] + w) { + d[v] = d[u] + w; + if (!queu[v]) { + q.push(v); queu[v] = 1; cnt[v]++; + // negative cycle + if (cnt[v] > n) { return 0; } } } } - return true; + return 1; } diff --git a/fontes/stable-matching.h b/fontes/stable-matching.h index eb2b592..e7817b4 100644 --- a/fontes/stable-matching.h +++ b/fontes/stable-matching.h @@ -1,24 +1,22 @@ -vector<vector<int>> pm (N, vector<int>(N)); // [m][j] = w -vector<vector<int>> pwix (N, vector<int>(N+1)); // [w][m] = j +vector<vi> pm (N, vi(N)); // [m][j] = w +vector<vi> pwix (N, vi(N+1)); // [w][m] = j -vector<bool> single (N, true); +vector<bool> single (N, 1); vector<int> match (N, -1), watch (N, N); vector<ii> galeshapley(int n) { // sentinel for (int w = 0; w < n; w++) { pwix[w][n] = n; } - bool done = false; + bool done = 0; while (!done) { - done = true; + done = 1; for (int m = 0; m < n; m++) if (single[m]) { - done = false; - match[m] += 1; + done = 0; match[m] += 1; int w = pm[m][match[m]]; if (pwix[w][m] < pwix[w][watch[w]]) { - single[watch[w]] = true; - watch[w] = m; - single[m] = false; + single[watch[w]] = 1; + watch[w] = m; single[m] = 0; } } } diff --git a/fontes/stoer-wagner.h b/fontes/stoer-wagner.h index 28eac66..f03b4fe 100644 --- a/fontes/stoer-wagner.h +++ b/fontes/stoer-wagner.h @@ -1,26 +1,23 @@ vector<vector<int>> res (N, vector<int>(N)); -vector<int> dist (N); -vector<bool> visited (N); vector<bool> bin (N); int contract(int n, int &s, int &t) { - fill(dist.begin(), dist.end(), 0); - fill(visited.begin(), visited.end(), 0); + vector<int> dist (n); + vector<bool> vis (n); int mincut, maxc; for (int i = 0; i < n; i++) { int k = -1; maxc = -1; for (int j = 0; j < n; j++) - if (!bin[j] && !visited[j] && dist[j] > maxc) { + if (!bin[j] && !vis[j] && dist[j] > maxc) { k = j; maxc = dist[j]; } if (k == -1) return mincut; - s = t; t = k; - mincut = maxc; - visited[k] = true; + s = t; t = k; + mincut = maxc; vis[k] = 1; for (int j = 1; j < n; j++) - if (!bin[j] && !visited[j]) { + if (!bin[j] && !vis[j]) { dist[j] += res[k][j]; } } @@ -33,7 +30,7 @@ int stoer_wagner(int n) { for (int i = 0; i < n-1; i++) { mincut = min(mincut, contract(n, s, t)); if (mincut == 0) { return 0; } - bin[t] = true; + bin[t] = 1; for (int j = 0; j < n; j++) if (!bin[j]) { res[s][j] = (res[j][s] += res[j][t]); } diff --git a/fontes/suffix-array-radix.h b/fontes/suffix-array-radix.h index cb475a6..89bc425 100644 --- a/fontes/suffix-array-radix.h +++ b/fontes/suffix-array-radix.h @@ -2,7 +2,7 @@ pair<vector<int>, vector<int>> build_sa(string s, int n) { vector<int> sk (n), sa (n); vector<pair<int, int>> a (n); for (int i = 0; i < n; i++) { a[i] = { s[i], i }; } - sort(a.begin(), a.end()); + sort(begin(a), end(a)); for (int i = 0; i < n; i++) { tie(sk[i], sa[i]) = a[i]; } vector<int> nsk(n); for (int i = 1, r = 0; i < n; i++) @@ -19,7 +19,7 @@ pair<vector<int>, vector<int>> build_sa(string s, int n) { for (int i = 1, r = 0; i < n; i++) nsk[sa[i]] = make_pair(sk[sa[i-1]], sk[(sa[i-1]+k)%n]) == - make_pair(sk[sa[i-0]], sk[(sa[i-0]+k)%n]) ? r : ++r; + make_pair(sk[sa[i]], sk[(sa[i]+k)%n]) ? r : ++r; sk.swap(nsk); } return make_pair(sa, sk); diff --git a/fontes/suffix-array.h b/fontes/suffix-array.h index 3c210b3..e66e853 100644 --- a/fontes/suffix-array.h +++ b/fontes/suffix-array.h @@ -3,12 +3,12 @@ pair<vector<int>, vector<int>> build_sa(string s) { int n = s.size(); - vector<int> sk (s.begin(), s.end()); + vector<int> sk (begin(s), end(s)); vector<pair<pair<int, int>, int>> a(n); for (int k = 1; k < n; k *= 2) { for (int i = 0; i < n; i++) a[i] = { { sk[i], sk[(i+k)%n] }, i }; - sort(a.begin(), a.end()); + sort(begin(a), end(a)); sk[a[0].ii] = 0; for (int i = 1, r = 0; i < n; i++) sk[a[i].ii] = a[i-1].kk == a[i].kk ? r : ++r; diff --git a/fontes/suffix-automaton.h b/fontes/suffix-automaton.h index 1802f4a..ec7e60b 100644 --- a/fontes/suffix-automaton.h +++ b/fontes/suffix-automaton.h @@ -10,7 +10,7 @@ void add(int c) { int q = nxt[p][c]; if (len[q] == len[p]+1) { lnk[cur] = q; return; } int qq = sz++; len[qq] = len[p]+1; lnk[qq] = lnk[q]; - copy(nxt[q].begin(), nxt[q].end(), nxt[qq].begin()); + copy(begin(nxt[q]), end(nxt[q]), begin(nxt[qq])); for (; ~p && nxt[p][c] == q; p = lnk[p]) nxt[p][c] = qq; lnk[cur] = lnk[q] = qq; diff --git a/fontes/suffix-tree.h b/fontes/suffix-tree.h index b59154b..cf5ae8a 100644 --- a/fontes/suffix-tree.h +++ b/fontes/suffix-tree.h @@ -1,45 +1,44 @@ -struct suffix_tree { - vector<vector<int>> nxt; - vector<int> l, r, parent, suf; - suffix_tree() : nxt(N, vector<int>(5)), l(N), r(N), - parent(N), suf(N) {} - int len(int i) { return r[i] - l[i] + 1; } - int at(string& s, int i, int j) { return id(s[l[i] + j]); } - int cur = 1; - int new_node(int a, int b, int p) { - l[cur] = a, r[cur] = b; parent[cur] = p; return cur++; - } - void build(string s) { - s += '$'; - int root = new_node(0, -1, 0); - int u = root, i = 0, ui = 0, ns = 0; - for (int j = 0; j < s.size(); j++) for (; i <= j; i++) { - if (ui == len(u) && nxt[u][id(s[j])]) - { u = nxt[u][id(s[j])]; ui = 0; } - if (ui < len(u) && at(s, u, ui) == id(s[j])) - { ui++; break; } - if (ui == len(u)) { - nxt[u][id(s[j])] = new_node(j, s.size()-1, u); - if (u != root) { u = suf[u]; ui = len(u); } +vector<vector<int>> nxt (N, vector<int>(5)); +vector<int> l (N), r (N), parent (N), suf (N); +int len(int i) { return r[i] - l[i] + 1; } +int at(string& s, int i, int j) { + return id(s[l[i] + j]); +} +int cur = 1; +int new_node(int a, int b, int p) { + l[cur] = a, r[cur] = b; parent[cur] = p; + return cur++; +} +void build(string s) { + s += '$'; + int root = new_node(0, -1, 0); + int u = root, i = 0, ui = 0, ns = 0; + for (int j = 0; j < s.size(); j++) for (; i <= j; i++) { + if (ui == len(u) && nxt[u][id(s[j])]) + { u = nxt[u][id(s[j])]; ui = 0; } + if (ui < len(u) && at(s, u, ui) == id(s[j])) + { ui++; break; } + if (ui == len(u)) { + nxt[u][id(s[j])] = new_node(j, s.size()-1, u); + if (u != root) { u = suf[u]; ui = len(u); } + } else { + int mi = new_node(l[u], l[u] + ui - 1, parent[u]); + nxt[parent[u]][at(s, mi, 0)] = mi; + nxt[mi][at(s, u, ui)] = u; + parent[u] = mi; l[u] += ui; + nxt[mi][id(s[j])] = new_node(j, s.size()-1, mi); + if (ns) { suf[ns] = mi; } + u = parent[mi]; int g; + if (u != root) + { u = suf[u]; g = j - ui; } else { g = i + 1; } + while (g < j && g + len(nxt[u][id(s[g])]) <= j) { + u = nxt[u][id(s[g])]; g += len(u); + } + if (g == j) { + ns = 0; suf[mi] = u; ui = len(u); } else { - int mi = new_node(l[u], l[u] + ui - 1, parent[u]); - nxt[parent[u]][at(s, mi, 0)] = mi; - nxt[mi][at(s, u, ui)] = u; - parent[u] = mi; l[u] += ui; - nxt[mi][id(s[j])] = new_node(j, s.size()-1, mi); - if (ns) { suf[ns] = mi; } - u = parent[mi]; int g; - if (u != root) - { u = suf[u]; g = j - ui; } else { g = i + 1; } - while (g < j && g + len(nxt[u][id(s[g])]) <= j) { - u = nxt[u][id(s[g])]; g += len(u); - } - if (g == j) { - ns = 0; suf[mi] = u; ui = len(u); - } else { - ns = mi; u = nxt[u][id(s[g])]; ui = j - g; - } + ns = mi; u = nxt[u][id(s[g])]; ui = j - g; } } } -}; +} diff --git a/fontes/topological-order.h b/fontes/topological-order.h index 285df03..10886bd 100644 --- a/fontes/topological-order.h +++ b/fontes/topological-order.h @@ -8,7 +8,7 @@ void dfs_topo(int u) { } vector<int> toposort(int n) { - fill(visited.begin(), visited.begin() + n, false); + fill(begin(vis), begin(vis) + n, 0); vector<int> topo; for (int u = 0; u < n; u++) { dfs_topo(u); } while (!st.empty()) { diff --git a/fontes/tree-square-root-decomposition.h b/fontes/tree-square-root-decomposition.h index b5b848b..5a9f3b9 100644 --- a/fontes/tree-square-root-decomposition.h +++ b/fontes/tree-square-root-decomposition.h @@ -2,25 +2,25 @@ vector<int> up (N), bup (N), depth (N); vector<ll> weiop (N), bweiop (N); void stdt_decompose(int u, int p, int w) { - up[u] = p; weiop[u] = w; - depth[u] = depth[p] + 1; - bup[u] = depth[u] % B ? bup[p] : p; - bweiop[u] = OP(depth[u] % B ? bweiop[p] : NEUTRAL, w); - for (auto [v, w] : g[u]) if (v != p) - stdt_decompose(v, u, w); + up[u] = p; weiop[u] = w; + depth[u] = depth[p] + 1; + bup[u] = depth[u] % B ? bup[p] : p; + bweiop[u] = OP(depth[u] % B ? bweiop[p] : NEUTRAL, w); + for (auto [v, w] : g[u]) if (v != p) + stdt_decompose(v, u, w); } int stdt_op(int a, int b) { - int ans = NEUTRAL; - if (!(depth[a]/B > depth[b]/B)) { swap(a, b); } - while (depth[a]/B > depth[b]/B) { - ans = OP(ans, bweiop[a]); a = bup[a]; } - if (!(depth[a] > depth[b])) { swap(a, b); } - while (depth[a] > depth[b]) { - ans = OP(ans, weiop[a]); a = up[a]; } - while (a != b) { - ans = OP(ans, OP(weiop[a], weiop[b])); - a = up[a]; b = up[b]; - } - return ans; + int ans = NEUTRAL; + if (!(depth[a]/B > depth[b]/B)) { swap(a, b); } + while (depth[a]/B > depth[b]/B) { + ans = OP(ans, bweiop[a]); a = bup[a]; } + if (!(depth[a] > depth[b])) { swap(a, b); } + while (depth[a] > depth[b]) { + ans = OP(ans, weiop[a]); a = up[a]; } + while (a != b) { + ans = OP(ans, OP(weiop[a], weiop[b])); + a = up[a]; b = up[b]; + } + return ans; } diff --git a/fontes/trie.h b/fontes/trie.h index 5fd31f9..113b9d9 100644 --- a/fontes/trie.h +++ b/fontes/trie.h @@ -1,6 +1,6 @@ struct trie { vector<int> nxt; int cnt; bool leaf; - trie() : nxt (S, -1), cnt (0), leaf (false) {} + trie() : nxt (S, -1), cnt (0), leaf (0) {} }; vector<trie> t (1); void ins(string ne) { @@ -14,5 +14,5 @@ void ins(string ne) { u = t[u].nxt[ch]; t[u].cnt++; } - t[u].leaf = true; + t[u].leaf = 1; } -- GitLab