summaryrefslogtreecommitdiff
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/datastructures/lichao.cpp5
-rw-r--r--content/datastructures/monotonicConvexHull.cpp9
-rw-r--r--content/datastructures/persistent.cpp36
-rw-r--r--content/datastructures/sparseTable.cpp4
-rw-r--r--content/datastructures/sparseTableDisjoint.cpp2
-rw-r--r--content/datastructures/treap.cpp2
-rw-r--r--content/geometry/antipodalPoints.cpp8
-rw-r--r--content/geometry/closestPair.cpp15
-rw-r--r--content/geometry/convexHull.cpp22
-rw-r--r--content/geometry/delaunay.cpp12
-rw-r--r--content/geometry/geometry.tex1
-rw-r--r--content/geometry/linesAndSegments.cpp4
-rw-r--r--content/geometry/polygon.cpp26
-rw-r--r--content/geometry/segmentIntersection.cpp4
-rw-r--r--content/geometry/sortAround.cpp2
-rw-r--r--content/graph/LCA_sparse.cpp8
-rw-r--r--content/graph/TSP.cpp4
-rw-r--r--content/graph/articulationPoints.cpp10
-rw-r--r--content/graph/bitonicTSP.cpp12
-rw-r--r--content/graph/bitonicTSPsimple.cpp14
-rw-r--r--content/graph/blossom.cpp14
-rw-r--r--content/graph/bronKerbosch.cpp4
-rw-r--r--content/graph/centroid.cpp2
-rw-r--r--content/graph/cycleCounting.cpp16
-rw-r--r--content/graph/dijkstra.cpp4
-rw-r--r--content/graph/dinic.cpp10
-rw-r--r--content/graph/dinicScaling.cpp10
-rw-r--r--content/graph/euler.cpp6
-rw-r--r--content/graph/floydWarshall.cpp12
-rw-r--r--content/graph/havelHakimi.cpp6
-rw-r--r--content/graph/hld.cpp2
-rw-r--r--content/graph/hopcroftKarp.cpp4
-rw-r--r--content/graph/kruskal.cpp2
-rw-r--r--content/graph/kuhn.cpp2
-rw-r--r--content/graph/matching.cpp10
-rw-r--r--content/graph/maxWeightBipartiteMatching.cpp4
-rw-r--r--content/graph/minCostMaxFlow.cpp12
-rw-r--r--content/graph/pushRelabel.cpp10
-rw-r--r--content/graph/reroot.cpp6
-rw-r--r--content/graph/scc.cpp8
-rw-r--r--content/graph/stoerWagner.cpp8
-rw-r--r--content/graph/treeIsomorphism.cpp4
-rw-r--r--content/graph/virtualTree.cpp10
-rw-r--r--content/math/berlekampMassey.cpp2
-rw-r--r--content/math/bigint.cpp63
-rw-r--r--content/math/discreteLogarithm.cpp4
-rw-r--r--content/math/gauss.cpp4
-rw-r--r--content/math/inversions.cpp2
-rw-r--r--content/math/inversionsMerge.cpp14
-rw-r--r--content/math/lgsFp.cpp2
-rw-r--r--content/math/linearRecurrence.cpp8
-rw-r--r--content/math/linearRecurrenceOld.cpp8
-rw-r--r--content/math/longestIncreasingSubsequence.cpp4
-rw-r--r--content/math/matrixPower.cpp2
-rw-r--r--content/math/permIndex.cpp4
-rw-r--r--content/math/piLegendre.cpp2
-rw-r--r--content/math/polynomial.cpp2
-rw-r--r--content/math/transforms/andTransform.cpp2
-rw-r--r--content/math/transforms/bitwiseTransforms.cpp2
-rw-r--r--content/math/transforms/fft.cpp2
-rw-r--r--content/math/transforms/fftMul.cpp6
-rw-r--r--content/math/transforms/multiplyBitwise.cpp2
-rw-r--r--content/math/transforms/multiplyFFT.cpp4
-rw-r--r--content/math/transforms/multiplyNTT.cpp2
-rw-r--r--content/math/transforms/ntt.cpp2
-rw-r--r--content/math/transforms/orTransform.cpp2
-rw-r--r--content/math/transforms/seriesOperations.cpp8
-rw-r--r--content/math/transforms/xorTransform.cpp2
-rw-r--r--content/other/fastSubsetSum.cpp10
-rw-r--r--content/other/pbs.cpp2
-rw-r--r--content/other/sos.cpp4
-rw-r--r--content/string/ahoCorasick.cpp11
-rw-r--r--content/string/deBruijn.cpp2
-rw-r--r--content/string/duval.cpp6
-rw-r--r--content/string/kmp.cpp8
-rw-r--r--content/string/longestCommonSubsequence.cpp8
-rw-r--r--content/string/lyndon.cpp2
-rw-r--r--content/string/manacher.cpp6
-rw-r--r--content/string/suffixArray.cpp14
-rw-r--r--content/string/suffixAutomaton.cpp12
-rw-r--r--content/string/suffixTree.cpp10
-rw-r--r--content/string/trie.cpp4
-rw-r--r--content/string/z.cpp2
-rw-r--r--content/template/template.cpp12
84 files changed, 313 insertions, 321 deletions
diff --git a/content/datastructures/lichao.cpp b/content/datastructures/lichao.cpp
index c20c61d..bdbf5f9 100644
--- a/content/datastructures/lichao.cpp
+++ b/content/datastructures/lichao.cpp
@@ -1,5 +1,6 @@
vector<ll> xs; // IMPORTANT: Initialize before constructing!
-int findX(int i) { return lower_bound(all(xs), i) - begin(xs); }
+int findX(int i) {
+ return ranges::lower_bound(xs, i) - begin(xs); }
struct Fun { // Default: Linear function. Change as needed.
ll m, c;
@@ -11,7 +12,7 @@ struct Lichao {
static constexpr Fun id = {0, INF}; // {0, -INF}
int n, cap;
vector<Fun> seg;
- Lichao() : n(sz(xs)), cap(2 << __lg(n)), seg(2 * cap, id) {}
+ Lichao() : n(ssize(xs)), cap(2 << __lg(n)), seg(2 * cap, id) {}
void _insert(Fun f, int l, int r, int i) {
while (i < 2 * cap) {
diff --git a/content/datastructures/monotonicConvexHull.cpp b/content/datastructures/monotonicConvexHull.cpp
index 2bdeccf..295acc4 100644
--- a/content/datastructures/monotonicConvexHull.cpp
+++ b/content/datastructures/monotonicConvexHull.cpp
@@ -12,15 +12,14 @@ struct Envelope {
}
void add(ll m, ll b) {
- while (sz(ls) > 1 && bad(ls.end()[-2], ls.back(), {m, b})) {
- ls.pop_back();
- }
+ while (ssize(ls) > 1
+ && bad(ls.end()[-2], ls.back(), {m,b})) ls.pop_back();
ls.push_back({m, b});
- ptr = min(ptr, (int)sz(ls) - 1);
+ ptr = min(ptr, (int)ssize(ls) - 1);
}
ll query(ll x) {
- while (ptr < sz(ls)-1 && ls[ptr + 1](x) < ls[ptr](x)) ptr++;
+ while (ptr < ssize(ls)-1 && ls[ptr+1](x) < ls[ptr](x)) ptr++;
return ls[ptr](x);
}
};
diff --git a/content/datastructures/persistent.cpp b/content/datastructures/persistent.cpp
index f26680d..9f38806 100644
--- a/content/datastructures/persistent.cpp
+++ b/content/datastructures/persistent.cpp
@@ -1,18 +1,18 @@
-template<typename T>
-struct persistent {
- int& time;
- vector<pair<int, T>> data;
-
- persistent(int& time, T value = {})
- : time(time), data(1, {2*time, value}) {}
-
- T get(int t) {
- return prev(upper_bound(all(data),pair{2*t+1, T{}}))->second;
- }
-
- int set(T value) {
- time++;
- data.push_back({2*time, value});
- return time;
- }
-};
+template<typename T>
+struct persistent {
+ int& time;
+ vector<pair<int, T>> data;
+
+ persistent(int& time, T value = {})
+ : time(time), data(1, {2*time, value}) {}
+
+ T get(int t) {
+ return prev(ranges::upper_bound(data,pair{2*t+1, T{}}))->second;
+ }
+
+ int set(T value) {
+ time++;
+ data.push_back({2*time, value});
+ return time;
+ }
+};
diff --git a/content/datastructures/sparseTable.cpp b/content/datastructures/sparseTable.cpp
index 5e84236..44989ab 100644
--- a/content/datastructures/sparseTable.cpp
+++ b/content/datastructures/sparseTable.cpp
@@ -7,10 +7,10 @@ struct SparseTable {
}
void init(vector<ll> &vec) {
- int n = sz(vec);
+ int n = ssize(vec);
a = vec.data();
st.assign(__lg(n) + 1, vector<int>(n));
- iota(all(st[0]), 0);
+ iota(begin(st[0]), end(st[0]), 0);
for (int j = 0; (2 << j) <= n; j++) {
for (int i = 0; i + (2 << j) <= n; i++) {
st[j + 1][i] = better(st[j][i] , st[j][i + (1 << j)]);
diff --git a/content/datastructures/sparseTableDisjoint.cpp b/content/datastructures/sparseTableDisjoint.cpp
index 39c7caa..bcf6b2e 100644
--- a/content/datastructures/sparseTableDisjoint.cpp
+++ b/content/datastructures/sparseTableDisjoint.cpp
@@ -8,7 +8,7 @@ struct DisjointST {
}
void init(vector<ll> &vec) {
- int n = sz(vec);
+ int n = ssize(vec);
a = vec.data();
dst.assign(__lg(n) + 1, vector<ll>(n + 1, neutral));
for (int h = 0, l = 1; l <= n; h++, l *= 2) {
diff --git a/content/datastructures/treap.cpp b/content/datastructures/treap.cpp
index c5a60e9..bddfdb4 100644
--- a/content/datastructures/treap.cpp
+++ b/content/datastructures/treap.cpp
@@ -66,7 +66,7 @@ struct Treap {
void insert(int i, ll val) { // and i = val
auto [left, right] = split(root, i);
treap.emplace_back(val);
- left = merge(left, sz(treap) - 1);
+ left = merge(left, ssize(treap) - 1);
root = merge(left, right);
}
diff --git a/content/geometry/antipodalPoints.cpp b/content/geometry/antipodalPoints.cpp
index 110cc74..b34b175 100644
--- a/content/geometry/antipodalPoints.cpp
+++ b/content/geometry/antipodalPoints.cpp
@@ -1,12 +1,12 @@
vector<pair<int, int>> antipodalPoints(vector<pt>& h) {
- if (sz(h) < 2) return {};
+ if (ssize(h) < 2) return {};
vector<pair<int, int>> result;
for (int i = 0, j = 1; i < j; i++) {
while (true) {
result.push_back({i, j});
- if (cross(h[(i + 1) % sz(h)] - h[i],
- h[(j + 1) % sz(h)] - h[j]) <= 0) break;
- j = (j + 1) % sz(h);
+ if (cross(h[(i + 1) % ssize(h)] - h[i],
+ h[(j + 1) % ssize(h)] - h[j]) <= 0) break;
+ j = (j + 1) % ssize(h);
}}
return result;
}
diff --git a/content/geometry/closestPair.cpp b/content/geometry/closestPair.cpp
index 9b115f3..bbefa67 100644
--- a/content/geometry/closestPair.cpp
+++ b/content/geometry/closestPair.cpp
@@ -4,12 +4,11 @@ ll rec(vector<pt>::iterator a, int l, int r) {
ll midx = a[m].real();
ll ans = min(rec(a, l, m), rec(a, m, r));
- inplace_merge(a+l, a+m, a+r, [](const pt& x, const pt& y) {
- return x.imag() < y.imag();
- });
+ ranges::inplace_merge(a+l, a+m, a+r, {},
+ [](pt x) { return imag(x); });
pt tmp[8];
- fill(all(tmp), a[l]);
+ ranges::fill(tmp, a[l]);
for (int i = l + 1, next = 0; i < r; i++) {
if (ll x = a[i].real() - midx; x * x < ans) {
for (pt& p : tmp) ans = min(ans, norm(p - a[i]));
@@ -19,9 +18,7 @@ ll rec(vector<pt>::iterator a, int l, int r) {
return ans;
}
-ll shortestDist(vector<pt> a) { // sz(pts) > 1
- sort(all(a), [](const pt& x, const pt& y) {
- return x.real() < y.real();
- });
- return rec(a.begin(), 0, sz(a));
+ll shortestDist(vector<pt> a) { // size(pts) > 1
+ ranges::sort(a, {}, [](pt x) { return real(x); });
+ return rec(a.begin(), 0, ssize(a));
}
diff --git a/content/geometry/convexHull.cpp b/content/geometry/convexHull.cpp
index 1173924..03c6343 100644
--- a/content/geometry/convexHull.cpp
+++ b/content/geometry/convexHull.cpp
@@ -1,18 +1,16 @@
vector<pt> convexHull(vector<pt> pts){
- sort(all(pts), [](const pt& a, const pt& b){
- return real(a) == real(b) ? imag(a) < imag(b)
- : real(a) < real(b);
- });
- pts.erase(unique(all(pts)), pts.end());
+ ranges::sort(pts, {},
+ [](pt x) { return pair{real(x), imag(x)}; });
+ pts.erase(begin(ranges::unique(pts)), end(pts));
int k = 0;
- vector<pt> h(2 * sz(pts));
- auto half = [&](auto begin, auto end, int t) {
- for (auto it = begin; it != end; it++) {
- while (k > t && cross(h[k-2], h[k-1], *it) <= 0) k--;
- h[k++] = *it;
+ vector<pt> h(2 * ssize(pts));
+ auto half = [&](auto &&v, int t) {
+ for (auto x: v) {
+ while (k > t && cross(h[k-2], h[k-1], x) <= 0) k--;
+ h[k++] = x;
}};
- half(all(pts), 1); // Untere Hülle.
- half(next(pts.rbegin()), pts.rend(), k); // Obere Hülle.
+ half(pts, 1); // Untere Hülle.
+ half(pts | views::reverse | views::drop(1), k); // Obere Hülle
h.resize(k);
return h;
}
diff --git a/content/geometry/delaunay.cpp b/content/geometry/delaunay.cpp
index 5672b57..9ae9061 100644
--- a/content/geometry/delaunay.cpp
+++ b/content/geometry/delaunay.cpp
@@ -99,12 +99,10 @@ pair<QuadEdge*, QuadEdge*> rec(IT l, IT r) {
}
vector<pt> delaunay(vector<pt> pts) {
- if (sz(pts) <= 2) return {};
- sort(all(pts), [](const pt& a, const pt& b) {
- if (real(a) != real(b)) return real(a) < real(b);
- return imag(a) < imag(b);
- });
- QuadEdge* r = rec(all(pts)).first;
+ if (ssize(pts) <= 2) return {};
+ ranges::sort(pts, {},
+ [](pt x) { return pair{real(x), imag(x)}; });
+ QuadEdge* r = rec(begin(pts), end(pts)).first;
vector<QuadEdge*> edges = {r};
while (cross(r->onext->dest(), r->dest(), r->orig) < 0) r = r->onext;
auto add = [&](QuadEdge* e){
@@ -118,7 +116,7 @@ vector<pt> delaunay(vector<pt> pts) {
};
add(r);
pts.clear();
- for (int i = 0; i < sz(edges); i++) {
+ for (int i = 0; i < ssize(edges); i++) {
if (!edges[i]->used) add(edges[i]);
}
return pts;
diff --git a/content/geometry/geometry.tex b/content/geometry/geometry.tex
index 976fb4d..9290de4 100644
--- a/content/geometry/geometry.tex
+++ b/content/geometry/geometry.tex
@@ -18,6 +18,7 @@
\end{itemize}
\sourcecode{geometry/convexHull.cpp}
\end{algorithm}
+\columnbreak
\begin{algorithm}{Rotating calipers}
\begin{methods}
diff --git a/content/geometry/linesAndSegments.cpp b/content/geometry/linesAndSegments.cpp
index db34179..985ee24 100644
--- a/content/geometry/linesAndSegments.cpp
+++ b/content/geometry/linesAndSegments.cpp
@@ -28,9 +28,7 @@ pt projectToLine(pt a, pt b, pt p) {
// sortiert alle Punkte pts auf einer Linie entsprechend dir
void sortLine(pt dir, vector<pt>& pts) { // (2d und 3d)
- sort(all(pts), [&](pt a, pt b){
- return dot(dir, a) < dot(dir, b);
- });
+ ranges::sort(pts, {}, [&](pt x) { return dot(dir, x); });
}
// Liegt p auf der Strecke a-b? (nutze < für inberhalb)
diff --git a/content/geometry/polygon.cpp b/content/geometry/polygon.cpp
index b9ecebb..626162a 100644
--- a/content/geometry/polygon.cpp
+++ b/content/geometry/polygon.cpp
@@ -2,7 +2,7 @@
// Punkte gegen den Uhrzeigersinn: positiv, sonst negativ.
double area(const vector<pt>& poly) { //poly[0] == poly.back()
ll res = 0;
- for (int i = 0; i + 1 < sz(poly); i++)
+ for (int i = 0; i + 1 < ssize(poly); i++)
res += cross(poly[i], poly[i + 1]);
return 0.5 * res;
}
@@ -13,7 +13,7 @@ double area(const vector<pt>& poly) { //poly[0] == poly.back()
// selbstschneidenden Polygonen (definitions Sache)
ll windingNumber(pt p, const vector<pt>& poly) {
ll res = 0;
- for (int i = 0; i + 1 < sz(poly); i++) {
+ for (int i = 0; i + 1 < ssize(poly); i++) {
pt a = poly[i], b = poly[i + 1];
if (real(a) > real(b)) swap(a, b);
if (real(a) <= real(p) && real(p) < real(b) &&
@@ -27,7 +27,7 @@ ll windingNumber(pt p, const vector<pt>& poly) {
// Ändere Zeile 32 falls rand zählt, poly[0] == poly.back()
bool inside(pt p, const vector<pt>& poly) {
bool in = false;
- for (int i = 0; i + 1 < sz(poly); i++) {
+ for (int i = 0; i + 1 < ssize(poly); i++) {
pt a = poly[i], b = poly[i + 1];
if (pointOnSegment(a, b, p)) return false;
if (real(a) > real(b)) swap(a,b);
@@ -41,7 +41,7 @@ bool inside(pt p, const vector<pt>& poly) {
// convex hull without duplicates, h[0] != h.back()
// apply comments if border counts as inside
bool insideConvex(pt p, const vector<pt>& hull) {
- int l = 0, r = sz(hull) - 1;
+ int l = 0, r = ssize(hull) - 1;
if (cross(hull[0], hull[r], p) >= 0) return false; // > 0
while (l + 1 < r) {
int m = (l + r) / 2;
@@ -52,11 +52,9 @@ bool insideConvex(pt p, const vector<pt>& hull) {
}
void rotateMin(vector<pt>& hull) {
- auto mi = min_element(all(hull), [](const pt& a, const pt& b){
- return real(a) == real(b) ? imag(a) < imag(b)
- : real(a) < real(b);
- });
- rotate(hull.begin(), mi, hull.end());
+ auto mi = ranges::min_element(hull, {},
+ [](pt a) { return pair{real(a), imag(a)}; });
+ ranges::rotate(hull, mi);
}
// convex hulls without duplicates, h[0] != h.back()
@@ -68,7 +66,7 @@ vector<pt> minkowski(vector<pt> ps, vector<pt> qs) {
ps.push_back(ps[1]);
qs.push_back(qs[1]);
vector<pt> res;
- for (ll i = 0, j = 0; i + 2 < sz(ps) || j + 2 < sz(qs);) {
+ for (ll i = 0, j = 0; i + 2 < ssize(ps) || j + 2 < ssize(qs);) {
res.push_back(ps[i] + qs[j]);
auto c = cross(ps[i + 1] - ps[i], qs[j + 1] - qs[j]);
if(c >= 0) i++;
@@ -84,7 +82,7 @@ double dist(const vector<pt>& ps, vector<pt> qs) {
p.push_back(p[0]);
double res = INF;
bool intersect = true;
- for (ll i = 0; i + 1 < sz(p); i++) {
+ for (ll i = 0; i + 1 < ssize(p); i++) {
intersect &= cross(p[i], p[i+1]) >= 0;
res = min(res, distToSegment(p[i], p[i+1], 0));
}
@@ -99,7 +97,7 @@ bool left(pt of, pt p) { return cross(p, of) < 0 ||
// returns index of corner where dot(dir, corner) is maximized
int extremal(const vector<pt>& hull, pt dir) {
dir *= pt(0, 1);
- int l = 0, r = sz(hull) - 1;
+ int l = 0, r = ssize(hull) - 1;
while (l + 1 < r) {
int m = (l + r) / 2;
pt dm = hull[m+1]-hull[m];
@@ -111,7 +109,7 @@ int extremal(const vector<pt>& hull, pt dir) {
if (cross(dir, dm) < 0) l = m;
else r = m;
}}
- return r % (sz(hull) - 1);
+ return r % (ssize(hull) - 1);
}
// convex hulls without duplicates, hull[0] == hull.back() and
@@ -127,7 +125,7 @@ vector<int> intersectLine(const vector<pt>& hull, pt a, pt b) {
if (cross(hull[endA], a, b) > 0 ||
cross(hull[endB], a, b) < 0) return {};
- int n = sz(hull) - 1;
+ int n = ssize(hull) - 1;
vector<int> res;
for (auto _ : {0, 1}) {
int l = endA, r = endB;
diff --git a/content/geometry/segmentIntersection.cpp b/content/geometry/segmentIntersection.cpp
index afc01b2..9fdbdb8 100644
--- a/content/geometry/segmentIntersection.cpp
+++ b/content/geometry/segmentIntersection.cpp
@@ -39,10 +39,10 @@ pair<int, int> intersect(vector<seg>& segs) {
events.push_back({s.a, s.id, 1});
events.push_back({s.b, s.id, -1});
}
- sort(all(events));
+ ranges::sort(events, less{});
set<seg> q;
- vector<set<seg>::iterator> where(sz(segs));
+ vector<set<seg>::iterator> where(ssize(segs));
for (auto e : events) {
int id = e.id;
if (e.type > 0) {
diff --git a/content/geometry/sortAround.cpp b/content/geometry/sortAround.cpp
index 9b09808..7e9d1de 100644
--- a/content/geometry/sortAround.cpp
+++ b/content/geometry/sortAround.cpp
@@ -3,7 +3,7 @@ bool left(pt p) { return real(p) < 0 ||
// counter clockwise, starting with "11:59"
void sortAround(pt p, vector<pt>& ps) {
- sort(all(ps), [&](const pt& a, const pt& b){
+ ranges::sort(ps, [&](const pt& a, const pt& b){
if (left(a - p) != left(b - p))
return left(a - p) > left(b - p);
return cross(p, a, b) > 0;
diff --git a/content/graph/LCA_sparse.cpp b/content/graph/LCA_sparse.cpp
index e391948..22a9082 100644
--- a/content/graph/LCA_sparse.cpp
+++ b/content/graph/LCA_sparse.cpp
@@ -5,9 +5,9 @@ struct LCA {
SparseTable st; //sparse table @\sourceref{datastructures/sparseTable.cpp}@
void init(vector<vector<int>>& adj, int root) {
- depth.assign(2 * sz(adj), 0);
- visited.assign(2 * sz(adj), -1);
- first.assign(sz(adj), 2 * sz(adj));
+ depth.assign(2 * ssize(adj), 0);
+ visited.assign(2 * ssize(adj), -1);
+ first.assign(ssize(adj), 2 * ssize(adj));
idx = 0;
dfs(adj, root);
st.init(depth);
@@ -18,7 +18,7 @@ struct LCA {
first[v] = min(idx, first[v]), idx++;
for (int u : adj[v]) {
- if (first[u] == 2 * sz(adj)) {
+ if (first[u] == 2 * ssize(adj)) {
dfs(adj, u, d + 1);
visited[idx] = v, depth[idx] = d, idx++;
}}}
diff --git a/content/graph/TSP.cpp b/content/graph/TSP.cpp
index 6223858..4d2479c 100644
--- a/content/graph/TSP.cpp
+++ b/content/graph/TSP.cpp
@@ -1,7 +1,7 @@
vector<vector<ll>> dist; // Entfernung zwischen je zwei Punkten.
auto TSP() {
- int n = sz(dist), m = 1 << n;
+ int n = ssize(dist), m = 1 << n;
vector<vector<edge>> dp(n, vector<edge>(m, edge{INF, -1}));
for (int c = 0; c < n; c++)
@@ -21,7 +21,7 @@ auto TSP() {
vector<int> tour = {0};
int v = 0;
- while (tour.back() != 0 || sz(tour) == 1)
+ while (tour.back() != 0 || ssize(tour) == 1)
tour.push_back(dp[tour.back()]
[(v |= (1 << tour.back()))].to);
// Enthält Knoten 0 zweimal. An erster und letzter Position.
diff --git a/content/graph/articulationPoints.cpp b/content/graph/articulationPoints.cpp
index 25ff67e..60970e6 100644
--- a/content/graph/articulationPoints.cpp
+++ b/content/graph/articulationPoints.cpp
@@ -14,14 +14,14 @@ int dfs(int v, int from = -1) {
if (num[e.to] < me) st.push_back(e);
} else {
if (v == root) rootCount++;
- int si = sz(st);
+ int si = ssize(st);
int up = dfs(e.to, e.id);
top = min(top, up);
if (up >= me) isArt[v] = true;
if (up > me) bridges.push_back(e);
if (up <= me) st.push_back(e);
if (up == me) {
- bcc.emplace_back(si + all(st));
+ bcc.emplace_back(begin(st) + si, end(st));
st.resize(si);
}}}
return top;
@@ -29,12 +29,12 @@ int dfs(int v, int from = -1) {
void find() {
counter = 0;
- num.assign(sz(adj), 0);
- isArt.assign(sz(adj), false);
+ num.assign(ssize(adj), 0);
+ isArt.assign(ssize(adj), false);
bridges.clear();
st.clear();
bcc.clear();
- for (int v = 0; v < sz(adj); v++) {
+ for (int v = 0; v < ssize(adj); v++) {
if (!num[v]) {
root = v;
rootCount = 0;
diff --git a/content/graph/bitonicTSP.cpp b/content/graph/bitonicTSP.cpp
index a6f4c6e..eeff156 100644
--- a/content/graph/bitonicTSP.cpp
+++ b/content/graph/bitonicTSP.cpp
@@ -1,10 +1,10 @@
vector<vector<double>> dist; // Initialisiere mit Entfernungen zwischen Punkten.
auto bitonicTSP() {
- vector<double> dp(sz(dist), HUGE_VAL);
- vector<int> pre(sz(dist)); // nur für Tour
+ vector<double> dp(ssize(dist), HUGE_VAL);
+ vector<int> pre(ssize(dist)); // nur für Tour
dp[0] = 0; dp[1] = 2 * dist[0][1]; pre[1] = 0;
- for (unsigned int i = 2; i < sz(dist); i++) {
+ for (unsigned int i = 2; i < ssize(dist); i++) {
double link = 0;
for (int j = i - 2; j >= 0; j--) {
link += dist[j + 1][j + 2];
@@ -15,7 +15,7 @@ auto bitonicTSP() {
}}}
// return dp.back(); // Länge der Tour
- int j, n = sz(dist) - 1;
+ int j, n = ssize(dist) - 1;
vector<int> ut, lt = {n, n - 1};
do {
j = pre[n];
@@ -25,7 +25,7 @@ auto bitonicTSP() {
}
} while(n = j + 1, j > 0);
(lt.back() == 1 ? lt : ut).push_back(0);
- reverse(all(lt));
- lt.insert(lt.end(), all(ut));
+ ranges::reverse(lt);
+ lt.insert(end(lt), begin(ut), end(ut));
return lt; // Enthält Knoten 0 zweimal. An erster und letzter Position.
}
diff --git a/content/graph/bitonicTSPsimple.cpp b/content/graph/bitonicTSPsimple.cpp
index cacfb9c..b6d72d8 100644
--- a/content/graph/bitonicTSPsimple.cpp
+++ b/content/graph/bitonicTSPsimple.cpp
@@ -3,7 +3,7 @@ vector<vector<double>> dp;
double get(int p1, int p2) {
int v = max(p1, p2) + 1;
- if (v == sz(dist)) return dist[p1][v - 1] + dist[p2][v - 1];
+ if (v == ssize(dist)) return dist[p1][v - 1] + dist[p2][v - 1];
if (dp[p1][p2] >= 0.0) return dp[p1][p2];
double tryLR = dist[p1][v] + get(v, p2);
double tryRL = dist[p2][v] + get(p1, v);
@@ -11,17 +11,19 @@ double get(int p1, int p2) {
}
auto bitonicTSP() {
- dp = vector<vector<double>>(sz(dist),
- vector<double>(sz(dist), -1));
+ dp = vector<vector<double>>(ssize(dist),
+ vector<double>(ssize(dist), -1));
get(0, 0);
- // return dp[0][0]; // Länger der Tour
+ // return dp[0][0]; // Länge der Tour
vector<int> lr = {0}, rl = {0};
- for (int p1 = 0, p2 = 0, v; (v = max(p1, p2)+1) < sz(dist);) {
+ for (int p1 = 0, p2 = 0, v;
+ (v = max(p1, p2)+1) < ssize(dist);) {
if (dp[p1][p2] == dist[p1][v] + dp[v][p2]) {
lr.push_back(v); p1 = v;
} else {
rl.push_back(v); p2 = v;
}}
lr.insert(lr.end(), rl.rbegin(), rl.rend());
- return lr; // Enthält Knoten 0 zweimal. An erster und letzter Position.
+ // Enthält Knoten 0 zweimal. An erster und letzter Position.
+ return lr;
}
diff --git a/content/graph/blossom.cpp b/content/graph/blossom.cpp
index 7bd494a..3c9bd31 100644
--- a/content/graph/blossom.cpp
+++ b/content/graph/blossom.cpp
@@ -32,7 +32,7 @@ struct GM {
auto h = label[r] = label[s] = {~x, y};
int join;
while (true) {
- if (s != sz(adj)) swap(r, s);
+ if (s != ssize(adj)) swap(r, s);
r = findFirst(label[pairs[r]].first);
if (label[r] == h) {
join = r;
@@ -48,13 +48,13 @@ struct GM {
}}}
bool augment(int v) {
- label[v] = {sz(adj), -1};
- first[v] = sz(adj);
+ label[v] = {ssize(adj), -1};
+ first[v] = ssize(adj);
head = tail = 0;
for (que[tail++] = v; head < tail;) {
int x = que[head++];
for (int y : adj[x]) {
- if (pairs[y] == sz(adj) && y != v) {
+ if (pairs[y] == ssize(adj) && y != v) {
pairs[y] = x;
rematch(x, y);
return true;
@@ -70,12 +70,12 @@ struct GM {
int match() {
int matching = head = tail = 0;
- for (int v = 0; v < sz(adj); v++) {
- if (pairs[v] < sz(adj) || !augment(v)) continue;
+ for (int v = 0; v < ssize(adj); v++) {
+ if (pairs[v] < ssize(adj) || !augment(v)) continue;
matching++;
for (int i = 0; i < tail; i++)
label[que[i]] = label[pairs[que[i]]] = {-1, -1};
- label[sz(adj)] = {-1, -1};
+ label[ssize(adj)] = {-1, -1};
}
return matching;
}
diff --git a/content/graph/bronKerbosch.cpp b/content/graph/bronKerbosch.cpp
index 0cfcc5f..cf07c88 100644
--- a/content/graph/bronKerbosch.cpp
+++ b/content/graph/bronKerbosch.cpp
@@ -11,7 +11,7 @@ void bronKerboschRec(bits R, bits P, bits X) {
} else {
int q = min(P._Find_first(), X._Find_first());
bits cands = P & ~adj[q];
- for (int i = 0; i < sz(adj); i++) if (cands[i]) {
+ for (int i = 0; i < ssize(adj); i++) if (cands[i]) {
R[i] = 1;
bronKerboschRec(R, P & adj[i], X & adj[i]);
R[i] = P[i] = 0;
@@ -20,5 +20,5 @@ void bronKerboschRec(bits R, bits P, bits X) {
void bronKerbosch() {
cliques.clear();
- bronKerboschRec({}, {(1ull << sz(adj)) - 1}, {});
+ bronKerboschRec({}, {(1ull << ssize(adj)) - 1}, {});
}
diff --git a/content/graph/centroid.cpp b/content/graph/centroid.cpp
index 820945b..3cd5519 100644
--- a/content/graph/centroid.cpp
+++ b/content/graph/centroid.cpp
@@ -15,7 +15,7 @@ pair<int, int> dfs_cent(int v, int from, int n) {
}
pair<int, int> find_centroid(int root = 0) {
- s.resize(sz(adj));
+ s.resize(ssize(adj));
dfs_sz(root);
return dfs_cent(root, -1, s[root]);
}
diff --git a/content/graph/cycleCounting.cpp b/content/graph/cycleCounting.cpp
index 471d399..65bf1a0 100644
--- a/content/graph/cycleCounting.cpp
+++ b/content/graph/cycleCounting.cpp
@@ -9,8 +9,8 @@ struct cycles {
cycles(int n) : adj(n), seen(n), paths(n) {}
void addEdge(int u, int v) {
- adj[u].push_back({v, sz(edges)});
- adj[v].push_back({u, sz(edges)});
+ adj[u].push_back({v, ssize(edges)});
+ adj[v].push_back({u, ssize(edges)});
edges.push_back({u, v});
}
@@ -38,8 +38,8 @@ struct cycles {
bool isCycle(cycle cur) { // cycle must be constrcuted from base
if (cur.none()) return false;
- init(sz(adj)); // union find @\sourceref{datastructures/unionFind.cpp}@
- for (int i = 0; i < sz(edges); i++) {
+ init(ssize(adj)); // union find @\sourceref{datastructures/unionFind.cpp}@
+ for (int i = 0; i < ssize(edges); i++) {
if (cur[i]) {
cur[i] = false;
if (findSet(edges[i].first) ==
@@ -50,12 +50,12 @@ struct cycles {
}
int count() {
- for (int i = 0; i < sz(adj); i++) findBase(i);
- assert(sz(base) < 30);
+ for (int i = 0; i < ssize(adj); i++) findBase(i);
+ assert(ssize(base) < 30);
int res = 0;
- for (int i = 1; i < (1 << sz(base)); i++) {
+ for (int i = 1; i < (1 << ssize(base)); i++) {
cycle cur;
- for (int j = 0; j < sz(base); j++)
+ for (int j = 0; j < ssize(base); j++)
if (((i >> j) & 1) != 0) cur ^= base[j];
if (isCycle(cur)) res++;
}
diff --git a/content/graph/dijkstra.cpp b/content/graph/dijkstra.cpp
index 61c636d..4c1c9d8 100644
--- a/content/graph/dijkstra.cpp
+++ b/content/graph/dijkstra.cpp
@@ -2,8 +2,8 @@ using path = pair<ll, int>; //dist, destination
auto dijkstra(const vector<vector<path>>& adj, int start) {
priority_queue<path, vector<path>, greater<path>> pq;
- vector<ll> dist(sz(adj), INF);
- vector<int> prev(sz(adj), -1);
+ vector<ll> dist(ssize(adj), INF);
+ vector<int> prev(ssize(adj), -1);
dist[start] = 0; pq.emplace(0, start);
while (!pq.empty()) {
diff --git a/content/graph/dinic.cpp b/content/graph/dinic.cpp
index 2e58a2d..c8c34a8 100644
--- a/content/graph/dinic.cpp
+++ b/content/graph/dinic.cpp
@@ -8,12 +8,12 @@ int s, t;
vector<int> pt, dist;
void addEdge(int u, int v, ll c) {
- adj[u].push_back({v, (int)sz(adj[v]), 0, c});
- adj[v].push_back({u, (int)sz(adj[u]) - 1, 0, 0});
+ adj[u].push_back({v, (int)ssize(adj[v]), 0, c});
+ adj[v].push_back({u, (int)ssize(adj[u]) - 1, 0, 0});
}
bool bfs() {
- dist.assign(sz(adj), -1);
+ dist.assign(ssize(adj), -1);
dist[s] = 0;
queue<int> q({s});
while (!q.empty() && dist[t] < 0) {
@@ -28,7 +28,7 @@ bool bfs() {
ll dfs(int v, ll flow = INF) {
if (v == t || flow == 0) return flow;
- for (; pt[v] < sz(adj[v]); pt[v]++) {
+ for (; pt[v] < ssize(adj[v]); pt[v]++) {
Edge& e = adj[v][pt[v]];
if (dist[e.to] != dist[v] + 1) continue;
ll cur = dfs(e.to, min(e.c - e.f, flow));
@@ -44,7 +44,7 @@ ll maxFlow(int source, int target) {
s = source, t = target;
ll flow = 0;
while (bfs()) {
- pt.assign(sz(adj), 0);
+ pt.assign(ssize(adj), 0);
ll cur;
do {
cur = dfs(s);
diff --git a/content/graph/dinicScaling.cpp b/content/graph/dinicScaling.cpp
index 0974b78..0082c05 100644
--- a/content/graph/dinicScaling.cpp
+++ b/content/graph/dinicScaling.cpp
@@ -8,12 +8,12 @@ int s, t;
vector<int> pt, dist;
void addEdge(int u, int v, ll c) {
- adj[u].push_back({v, (int)sz(adj[v]), 0, c});
- adj[v].push_back({u, (int)sz(adj[u]) - 1, 0, 0});
+ adj[u].push_back({v, (int)ssize(adj[v]), 0, c});
+ adj[v].push_back({u, (int)ssize(adj[u]) - 1, 0, 0});
}
bool bfs(ll lim) {
- dist.assign(sz(adj), -1);
+ dist.assign(ssize(adj), -1);
dist[s] = 0;
queue<int> q({s});
while (!q.empty() && dist[t] < 0) {
@@ -28,7 +28,7 @@ bool bfs(ll lim) {
ll dfs(int v, ll flow) {
if (v == t || flow == 0) return flow;
- for (; pt[v] < sz(adj[v]); pt[v]++) {
+ for (; pt[v] < ssize(adj[v]); pt[v]++) {
Edge& e = adj[v][pt[v]];
if (dist[e.to] != dist[v] + 1) continue;
ll cur = dfs(e.to, min(e.c - e.f, flow));
@@ -45,7 +45,7 @@ ll maxFlow(int source, int target) {
ll flow = 0;
for (ll lim = (1LL << 62); lim >= 1; lim /= 2) {
while (bfs(lim)) {
- pt.assign(sz(adj), 0);
+ pt.assign(ssize(adj), 0);
ll cur;
do {
cur = dfs(s, lim);
diff --git a/content/graph/euler.cpp b/content/graph/euler.cpp
index a5ea192..c506d58 100644
--- a/content/graph/euler.cpp
+++ b/content/graph/euler.cpp
@@ -3,16 +3,16 @@ vector<int> to, validIdx, cycle;
vector<bool> used;
void addEdge(int u, int v) {
- idx[u].push_back(sz(to));
+ idx[u].push_back(ssize(to));
to.push_back(v);
used.push_back(false);
- idx[v].push_back(sz(to)); // für ungerichtet
+ idx[v].push_back(ssize(to)); // für ungerichtet
to.push_back(u);
used.push_back(false);
}
void euler(int v) { // init idx und validIdx
- for (;validIdx[v] < sz(idx[v]); validIdx[v]++) {
+ for (;validIdx[v] < ssize(idx[v]); validIdx[v]++) {
if (!used[idx[v][validIdx[v]]]) {
int u = to[idx[v][validIdx[v]]];
used[idx[v][validIdx[v]]] = true;
diff --git a/content/graph/floydWarshall.cpp b/content/graph/floydWarshall.cpp
index df096c2..1a1138d 100644
--- a/content/graph/floydWarshall.cpp
+++ b/content/graph/floydWarshall.cpp
@@ -2,16 +2,16 @@ vector<vector<ll>> dist; // Entfernung zwischen je zwei Punkten.
vector<vector<int>> next;
void floydWarshall() {
- next.assign(sz(dist), vector<int>(sz(dist), -1));
- for (int i = 0; i < sz(dist); i++) {
- for (int j = 0; j < sz(dist); j++) {
+ next.assign(ssize(dist), vector<int>(ssize(dist), -1));
+ for (int i = 0; i < ssize(dist); i++) {
+ for (int j = 0; j < ssize(dist); j++) {
if (dist[i][j] < INF) {
next[i][j] = j;
}}}
- for (int k = 0; k < sz(dist); k++) {
- for (int i = 0; i < sz(dist); i++) {
- for (int j = 0; j < sz(dist); j++) {
+ for (int k = 0; k < ssize(dist); k++) {
+ for (int i = 0; i < ssize(dist); i++) {
+ for (int j = 0; j < ssize(dist); j++) {
// only needed if dist can be negative
if (dist[i][k] == INF || dist[k][j] == INF) continue;
if (dist[i][j] > dist[i][k] + dist[k][j]) {
diff --git a/content/graph/havelHakimi.cpp b/content/graph/havelHakimi.cpp
index ac4d67d..9f4c081 100644
--- a/content/graph/havelHakimi.cpp
+++ b/content/graph/havelHakimi.cpp
@@ -1,12 +1,12 @@
vector<vector<int>> havelHakimi(const vector<int>& deg) {
priority_queue<pair<int, int>> pq;
- for (int i = 0; i < sz(deg); i++) {
+ for (int i = 0; i < ssize(deg); i++) {
if (deg[i] > 0) pq.push({deg[i], i});
}
- vector<vector<int>> adj(sz(deg));
+ vector<vector<int>> adj(ssize(deg));
while (!pq.empty()) {
auto [degV, v] = pq.top(); pq.pop();
- if (sz(pq) < degV) return {}; //impossible
+ if (ssize(pq) < degV) return {}; //impossible
vector<pair<int, int>> todo(degV);
for (auto& e : todo) e = pq.top(), pq.pop();
for (auto [degU, u] : todo) {
diff --git a/content/graph/hld.cpp b/content/graph/hld.cpp
index 65d3f5c..e365b13 100644
--- a/content/graph/hld.cpp
+++ b/content/graph/hld.cpp
@@ -21,7 +21,7 @@ void dfs_hld(int v = 0, int from = -1) {
}
void init(int root = 0) {
- int n = sz(adj);
+ int n = ssize(adj);
sz.assign(n, 1), nxt.assign(n, root), par.assign(n, -1);
in.resize(n), out.resize(n);
counter = 0;
diff --git a/content/graph/hopcroftKarp.cpp b/content/graph/hopcroftKarp.cpp
index 7c0fec5..d07bd3a 100644
--- a/content/graph/hopcroftKarp.cpp
+++ b/content/graph/hopcroftKarp.cpp
@@ -21,7 +21,7 @@ bool bfs(int l) {
}
bool dfs(int v) {
- for (; ptr[v] < sz(adj[v]); ptr[v]++) {
+ for (; ptr[v] < ssize(adj[v]); ptr[v]++) {
int u = adj[v][ptr[v]];
if (pairs[u] < 0 ||
(dist[pairs[u]] > dist[v] && dfs(pairs[u]))) {
@@ -33,7 +33,7 @@ bool dfs(int v) {
int hopcroft_karp(int l) { // l = #Knoten links
int ans = 0;
- pairs.assign(sz(adj), -1);
+ pairs.assign(ssize(adj), -1);
dist.resize(l);
// Greedy Matching, optionale Beschleunigung.
for (int v = 0; v < l; v++) for (int u : adj[v])
diff --git a/content/graph/kruskal.cpp b/content/graph/kruskal.cpp
index 987d30b..d42800d 100644
--- a/content/graph/kruskal.cpp
+++ b/content/graph/kruskal.cpp
@@ -1,4 +1,4 @@
-sort(all(edges));
+ranges::sort(edges, less{});
vector<Edge> mst;
ll cost = 0;
for (Edge& e : edges) {
diff --git a/content/graph/kuhn.cpp b/content/graph/kuhn.cpp
index e928387..688c846 100644
--- a/content/graph/kuhn.cpp
+++ b/content/graph/kuhn.cpp
@@ -12,7 +12,7 @@ bool dfs(int v) {
}
int kuhn(int l) { // l = #Knoten links.
- pairs.assign(sz(adj), -1);
+ pairs.assign(ssize(adj), -1);
int ans = 0;
// Greedy Matching. Optionale Beschleunigung.
for (int v = 0; v < l; v++) for (int u : adj[v])
diff --git a/content/graph/matching.cpp b/content/graph/matching.cpp
index dcaea8c..3619d7c 100644
--- a/content/graph/matching.cpp
+++ b/content/graph/matching.cpp
@@ -3,19 +3,19 @@ vector<vector<ll>> adj, mat;
int max_matching() {
int ans = 0;
- mat.assign(sz(adj), {});
+ mat.assign(ssize(adj), {});
for (int _ = 0; _ < I; _++) {
- for (int v = 0; v < sz(adj); v++) {
- mat[v].assign(sz(adj), 0);
+ for (int v = 0; v < ssize(adj); v++) {
+ mat[v].assign(ssize(adj), 0);
for (int u : adj[v]) {
if (u < v) {
mat[v][u] = rand() % (MOD - 1) + 1;
mat[u][v] = MOD - mat[v][u];
}}}
- gauss(sz(adj), MOD); //LGS @\sourceref{math/lgsFp.cpp}@
+ gauss(ssize(adj), MOD); //LGS @\sourceref{math/lgsFp.cpp}@
int rank = 0;
for (auto& row : mat) {
- if (*max_element(all(row)) != 0) rank++;
+ if (*ranges::max_element(row) != 0) rank++;
}
ans = max(ans, rank / 2);
}
diff --git a/content/graph/maxWeightBipartiteMatching.cpp b/content/graph/maxWeightBipartiteMatching.cpp
index a2b0a80..b6f6ddf 100644
--- a/content/graph/maxWeightBipartiteMatching.cpp
+++ b/content/graph/maxWeightBipartiteMatching.cpp
@@ -45,6 +45,6 @@ double match(int l, int r) {
yx[y] = aug[y];
swap(y, xy[aug[y]]);
}}
- return accumulate(all(lx), 0.0) +
- accumulate(all(ly), 0.0); // Wert des Matchings
+ return accumulate(begin(lx), end(lx), 0.0) +
+ accumulate(begin(ly), end(ly), 0.0); // Wert des Matchings
}
diff --git a/content/graph/minCostMaxFlow.cpp b/content/graph/minCostMaxFlow.cpp
index 14a222c..fde95f3 100644
--- a/content/graph/minCostMaxFlow.cpp
+++ b/content/graph/minCostMaxFlow.cpp
@@ -15,16 +15,16 @@ struct MinCostFlow {
adj(n), s(source), t(target) {};
void addEdge(int u, int v, ll c, ll cost) {
- adj[u].push_back(sz(edges));
+ adj[u].push_back(ssize(edges));
edges.push_back({v, c, cost});
- adj[v].push_back(sz(edges));
+ adj[v].push_back(ssize(edges));
edges.push_back({u, 0, -cost});
}
bool SPFA() {
- pref.assign(sz(adj), -1);
- dist.assign(sz(adj), INF);
- vector<bool> inqueue(sz(adj));
+ pref.assign(ssize(adj), -1);
+ dist.assign(ssize(adj), INF);
+ vector<bool> inqueue(ssize(adj));
queue<int> queue;
dist[s] = 0;
queue.push(s);
@@ -59,7 +59,7 @@ struct MinCostFlow {
}}
void mincostflow() {
- con.assign(sz(adj), 0);
+ con.assign(ssize(adj), 0);
maxflow = mincost = 0;
while (SPFA()) extend();
}
diff --git a/content/graph/pushRelabel.cpp b/content/graph/pushRelabel.cpp
index ec36026..c569df2 100644
--- a/content/graph/pushRelabel.cpp
+++ b/content/graph/pushRelabel.cpp
@@ -9,8 +9,8 @@ vector<ll> ec;
vector<int> cur, H;
void addEdge(int u, int v, ll c) {
- adj[u].push_back({v, (int)sz(adj[v]), 0, c});
- adj[v].push_back({u, (int)sz(adj[u])-1, 0, 0});
+ adj[u].push_back({v, (int)ssize(adj[v]), 0, c});
+ adj[v].push_back({u, (int)ssize(adj[u])-1, 0, 0});
}
void addFlow(Edge& e, ll f) {
@@ -23,7 +23,7 @@ void addFlow(Edge& e, ll f) {
}
ll maxFlow(int s, int t) {
- int n = sz(adj);
+ int n = ssize(adj);
hs.assign(2*n, {});
ec.assign(n, 0);
cur.assign(n, 0);
@@ -38,9 +38,9 @@ ll maxFlow(int s, int t) {
int v = hs[hi].back();
hs[hi].pop_back();
while (ec[v] > 0) {
- if (cur[v] == sz(adj[v])) {
+ if (cur[v] == ssize(adj[v])) {
H[v] = 2*n;
- for (int i = 0; i < sz(adj[v]); i++) {
+ for (int i = 0; i < ssize(adj[v]); i++) {
Edge& e = adj[v][i];
if (e.c - e.f > 0 &&
H[v] > H[e.to] + 1) {
diff --git a/content/graph/reroot.cpp b/content/graph/reroot.cpp
index 379c839..5a9c9d1 100644
--- a/content/graph/reroot.cpp
+++ b/content/graph/reroot.cpp
@@ -26,11 +26,11 @@ struct Reroot {
pref.push_back(takeChild(v, u, w, dp[u]));
}
auto suf = pref;
- partial_sum(all(pref), pref.begin(), comb);
+ partial_sum(begin(pref), end(pref), begin(pref), comb);
exclusive_scan(suf.rbegin(), suf.rend(),
suf.rbegin(), E, comb);
- for (int i = 0; i < sz(adj[v]); i++) {
+ for (int i = 0; i < ssize(adj[v]); i++) {
auto [u, w] = adj[v][i];
if (u == from) continue;
dp[v] = fin(v, comb(pref[i], suf[i + 1]));
@@ -40,7 +40,7 @@ struct Reroot {
}
auto solve() {
- dp.assign(sz(adj), E);
+ dp.assign(ssize(adj), E);
dfs0(0);
dfs1(0);
return dp;
diff --git a/content/graph/scc.cpp b/content/graph/scc.cpp
index 32f1099..6887712 100644
--- a/content/graph/scc.cpp
+++ b/content/graph/scc.cpp
@@ -23,11 +23,11 @@ void visit(int v) {
}}}
void scc() {
- inStack.assign(sz(adj), false);
- low.assign(sz(adj), -1);
- idx.assign(sz(adj), -1);
+ inStack.assign(ssize(adj), false);
+ low.assign(ssize(adj), -1);
+ idx.assign(ssize(adj), -1);
counter = sccCounter = 0;
- for (int i = 0; i < sz(adj); i++) {
+ for (int i = 0; i < ssize(adj); i++) {
if (low[i] < 0) visit(i);
}}
diff --git a/content/graph/stoerWagner.cpp b/content/graph/stoerWagner.cpp
index 0a6f653..a122488 100644
--- a/content/graph/stoerWagner.cpp
+++ b/content/graph/stoerWagner.cpp
@@ -7,7 +7,7 @@ vector<vector<Edge>> adj, tmp;
vector<bool> erased;
void merge(int u, int v) {
- tmp[u].insert(tmp[u].end(), all(tmp[v]));
+ tmp[u].insert(end(tmp[u]), begin(tmp[v]), end(tmp[v]));
tmp[v].clear();
erased[v] = true;
for (auto& vec : tmp) {
@@ -19,13 +19,13 @@ void merge(int u, int v) {
ll stoer_wagner() {
ll res = INF;
tmp = adj;
- erased.assign(sz(tmp), false);
- for (int i = 1; i < sz(tmp); i++) {
+ erased.assign(ssize(tmp), false);
+ for (int i = 1; i < ssize(tmp); i++) {
int s = 0;
while (erased[s]) s++;
priority_queue<pair<ll, int>> pq;
pq.push({0, s});
- vector<ll> con(sz(tmp));
+ vector<ll> con(ssize(tmp));
ll cur = 0;
vector<pair<ll, int>> state;
while (!pq.empty()) {
diff --git a/content/graph/treeIsomorphism.cpp b/content/graph/treeIsomorphism.cpp
index 355fefb..8c2ca21 100644
--- a/content/graph/treeIsomorphism.cpp
+++ b/content/graph/treeIsomorphism.cpp
@@ -7,9 +7,9 @@ int treeLabel(int v, int from = -1) {
if (u == from) continue;
children.push_back(treeLabel(u, v));
}
- sort(all(children));
+ ranges::sort(children);
if (known.find(children) == known.end()) {
- known[children] = sz(known);
+ known[children] = ssize(known);
}
return known[children];
}
diff --git a/content/graph/virtualTree.cpp b/content/graph/virtualTree.cpp
index 153ed0b..81ba001 100644
--- a/content/graph/virtualTree.cpp
+++ b/content/graph/virtualTree.cpp
@@ -2,14 +2,14 @@
vector<int> in, out;
void virtualTree(vector<int> ind) { // indices of used nodes
- sort(all(ind), [&](int x, int y) { return in[x] < in[y]; });
- for (int i = 1, n = sz(ind); i < n; i++) {
+ ranges::sort(ind, {}, [&](int x) { return in[x]; });
+ for (int i = 1, n = ssize(ind); i < n; i++) {
ind.push_back(lca(ind[i - 1], ind[i]));
}
- sort(all(ind), [&](int x, int y) { return in[x] < in[y]; });
- ind.erase(unique(all(ind)), ind.end());
+ ranges::sort(ind, {}, [&](int x) { return in[x]; });
+ ind.erase(begin(ranges::unique(ind)), end(ind));
- int n = sz(ind);
+ int n = ssize(ind);
vector<vector<int>> tree(n);
vector<int> st = {0};
for (int i = 1; i < n; i++) {
diff --git a/content/math/berlekampMassey.cpp b/content/math/berlekampMassey.cpp
index 29e084f..85a1031 100644
--- a/content/math/berlekampMassey.cpp
+++ b/content/math/berlekampMassey.cpp
@@ -1,6 +1,6 @@
constexpr ll mod = 1'000'000'007;
vector<ll> BerlekampMassey(const vector<ll>& s) {
- int n = sz(s), L = 0, m = 0;
+ int n = ssize(s), L = 0, m = 0;
vector<ll> C(n), B(n), T;
C[0] = B[0] = 1;
diff --git a/content/math/bigint.cpp b/content/math/bigint.cpp
index 4dad2be..a40f515 100644
--- a/content/math/bigint.cpp
+++ b/content/math/bigint.cpp
@@ -22,10 +22,11 @@ struct bigint {
bigint operator+(const bigint& v) const {
if (sign == v.sign) {
bigint res = v;
- for (ll i = 0, carry = 0; i < max(sz(a), sz(v.a)) || carry; ++i) {
- if (i == sz(res.a))
+ for (ll i = 0, carry = 0;
+ i < max(ssize(a), ssize(v.a)) || carry; ++i) {
+ if (i == ssize(res.a))
res.a.push_back(0);
- res.a[i] += carry + (i < sz(a) ? a[i] : 0);
+ res.a[i] += carry + (i < ssize(a) ? a[i] : 0);
carry = res.a[i] >= base;
if (carry)
res.a[i] -= base;
@@ -39,8 +40,8 @@ struct bigint {
if (sign == v.sign) {
if (abs() >= v.abs()) {
bigint res = *this;
- for (ll i = 0, carry = 0; i < sz(v.a) || carry; ++i) {
- res.a[i] -= carry + (i < sz(v.a) ? v.a[i] : 0);
+ for (ll i = 0, carry = 0; i < ssize(v.a) || carry; ++i) {
+ res.a[i] -= carry + (i < ssize(v.a) ? v.a[i] : 0);
carry = res.a[i] < 0;
if (carry) res.a[i] += base;
}
@@ -54,8 +55,8 @@ struct bigint {
void operator*=(ll v) {
if (v < 0) sign = -sign, v = -v;
- for (ll i = 0, carry = 0; i < sz(a) || carry; ++i) {
- if (i == sz(a)) a.push_back(0);
+ for (ll i = 0, carry = 0; i < ssize(a) || carry; ++i) {
+ if (i == ssize(a)) a.push_back(0);
ll cur = a[i] * v + carry;
carry = cur / base;
a[i] = cur % base;
@@ -74,12 +75,12 @@ struct bigint {
bigint a = a1.abs() * norm;
bigint b = b1.abs() * norm;
bigint q, r;
- q.a.resize(sz(a.a));
- for (ll i = sz(a.a) - 1; i >= 0; i--) {
+ q.a.resize(ssize(a.a));
+ for (ll i = ssize(a.a) - 1; i >= 0; i--) {
r *= base;
r += a.a[i];
- ll s1 = sz(r.a) <= sz(b.a) ? 0 : r.a[sz(b.a)];
- ll s2 = sz(r.a) <= sz(b.a) - 1 ? 0 : r.a[sz(b.a) - 1];
+ ll s1 = ssize(r.a) <= ssize(b.a) ? 0 : r.a[ssize(b.a)];
+ ll s2 = ssize(r.a) <= ssize(b.a) - 1 ? 0 : r.a[ssize(b.a) - 1];
ll d = (base * s1 + s2) / b.a.back();
r -= b * d;
while (r < 0) r += b, --d;
@@ -102,7 +103,7 @@ struct bigint {
void operator/=(ll v) {
if (v < 0) sign = -sign, v = -v;
- for (ll i = sz(a) - 1, rem = 0; i >= 0; --i) {
+ for (ll i = ssize(a) - 1, rem = 0; i >= 0; --i) {
ll cur = a[i] + rem * base;
a[i] = cur / v;
rem = cur % v;
@@ -119,7 +120,7 @@ struct bigint {
ll operator%(ll v) const {
if (v < 0) v = -v;
ll m = 0;
- for (ll i = sz(a) - 1; i >= 0; --i)
+ for (ll i = ssize(a) - 1; i >= 0; --i)
m = (a[i] + m * base) % v;
return m * sign;
}
@@ -139,9 +140,9 @@ struct bigint {
bool operator<(const bigint& v) const {
if (sign != v.sign) return sign < v.sign;
- if (sz(a) != sz(v.a))
- return sz(a) * sign < sz(v.a) * v.sign;
- for (ll i = sz(a) - 1; i >= 0; i--)
+ if (ssize(a) != ssize(v.a))
+ return ssize(a) * sign < ssize(v.a) * v.sign;
+ for (ll i = ssize(a) - 1; i >= 0; i--)
if (a[i] != v.a[i])
return a[i] * sign < v.a[i] * sign;
return false;
@@ -169,7 +170,7 @@ struct bigint {
}
bool isZero() const {
- return a.empty() || (sz(a) == 1 && a[0] == 0);
+ return a.empty() || (ssize(a) == 1 && a[0] == 0);
}
bigint operator-() const {
@@ -186,7 +187,7 @@ struct bigint {
ll longValue() const {
ll res = 0;
- for (ll i = sz(a) - 1; i >= 0; i--)
+ for (ll i = ssize(a) - 1; i >= 0; i--)
res = res * base + a[i];
return res * sign;
}
@@ -195,11 +196,11 @@ struct bigint {
sign = 1;
a.clear();
ll pos = 0;
- while (pos < sz(s) && (s[pos] == '-' || s[pos] == '+')) {
+ while (pos < ssize(s) && (s[pos] == '-' || s[pos] == '+')) {
if (s[pos] == '-') sign = -sign;
++pos;
}
- for (ll i = sz(s) - 1; i >= pos; i -= base_digits) {
+ for (ll i = ssize(s) - 1; i >= pos; i -= base_digits) {
ll x = 0;
for (ll j = max(pos, i - base_digits + 1); j <= i; j++)
x = x * 10 + s[j] - '0';
@@ -218,13 +219,13 @@ struct bigint {
friend ostream& operator<<(ostream& stream, const bigint& v) {
if (v.sign == -1) stream << '-';
stream << (v.a.empty() ? 0 : v.a.back());
- for (ll i = sz(v.a) - 2; i >= 0; --i)
+ for (ll i = ssize(v.a) - 2; i >= 0; --i)
stream << setw(base_digits) << setfill('0') << v.a[i];
return stream;
}
static vll karatsubaMultiply(const vll& a, const vll& b) {
- ll n = sz(a);
+ ll n = ssize(a);
vll res(n + n);
if (n <= 32) {
for (ll i = 0; i < n; i++)
@@ -242,25 +243,25 @@ struct bigint {
for (ll i = 0; i < k; i++) a2[i] += a1[i];
for (ll i = 0; i < k; i++) b2[i] += b1[i];
vll r = karatsubaMultiply(a2, b2);
- for (ll i = 0; i < sz(a1b1); i++) r[i] -= a1b1[i];
- for (ll i = 0; i < sz(a2b2); i++) r[i] -= a2b2[i];
- for (ll i = 0; i < sz(r); i++) res[i + k] += r[i];
- for (ll i = 0; i < sz(a1b1); i++) res[i] += a1b1[i];
- for (ll i = 0; i < sz(a2b2); i++) res[i + n] += a2b2[i];
+ for (ll i = 0; i < ssize(a1b1); i++) r[i] -= a1b1[i];
+ for (ll i = 0; i < ssize(a2b2); i++) r[i] -= a2b2[i];
+ for (ll i = 0; i < ssize(r); i++) res[i + k] += r[i];
+ for (ll i = 0; i < ssize(a1b1); i++) res[i] += a1b1[i];
+ for (ll i = 0; i < ssize(a2b2); i++) res[i + n] += a2b2[i];
return res;
}
bigint operator*(const bigint& v) const {
vll ta(a.begin(), a.end());
vll va(v.a.begin(), v.a.end());
- while (sz(ta) < sz(va)) ta.push_back(0);
- while (sz(va) < sz(ta)) va.push_back(0);
- while (sz(ta) & (sz(ta) - 1))
+ while (ssize(ta) < ssize(va)) ta.push_back(0);
+ while (ssize(va) < ssize(ta)) va.push_back(0);
+ while (ssize(ta) & (ssize(ta) - 1))
ta.push_back(0), va.push_back(0);
vll ra = karatsubaMultiply(ta, va);
bigint res;
res.sign = sign * v.sign;
- for (ll i = 0, carry = 0; i < sz(ra); i++) {
+ for (ll i = 0, carry = 0; i < ssize(ra); i++) {
ll cur = ra[i] + carry;
res.a.push_back(cur % base);
carry = cur / base;
diff --git a/content/math/discreteLogarithm.cpp b/content/math/discreteLogarithm.cpp
index 68866e0..844bd27 100644
--- a/content/math/discreteLogarithm.cpp
+++ b/content/math/discreteLogarithm.cpp
@@ -5,11 +5,11 @@ ll dlog(ll a, ll b, ll m) { //a > 0!
vals[i] = {e, i};
}
vals.emplace_back(m, 0);
- sort(all(vals));
+ ranges::sort(vals);
ll fact = powMod(a, m - bound - 1, m);
for (ll i = 0; i < m; i += bound, b = (b * fact) % m) {
- auto it = lower_bound(all(vals), pair<ll, ll>{b, 0});
+ auto it = ranges::lower_bound(vals, pair<ll, ll>{b, 0});
if (it->first == b) {
return (i + it->second) % m;
}}
diff --git a/content/math/gauss.cpp b/content/math/gauss.cpp
index d431e52..719f573 100644
--- a/content/math/gauss.cpp
+++ b/content/math/gauss.cpp
@@ -7,7 +7,7 @@ void takeAll(int n, int line) {
for (int i = 0; i < n; i++) {
if (i == line) continue;
double diff = mat[i][line];
- for (int j = 0; j < sz(mat[i]); j++) {
+ for (int j = 0; j < ssize(mat[i]); j++) {
mat[i][j] -= diff * mat[line][j];
}}}
@@ -22,7 +22,7 @@ int gauss(int n) {
if (abs(mat[i][i]) > EPS) {
normalLine(i);
takeAll(n, i);
- done[i] = true;
+ done[i] = true;
}}
for (int i = 0; i < n; i++) { // gauss fertig, prüfe Lösung
bool allZero = true;
diff --git a/content/math/inversions.cpp b/content/math/inversions.cpp
index 9e47f9b..289161f 100644
--- a/content/math/inversions.cpp
+++ b/content/math/inversions.cpp
@@ -1,7 +1,7 @@
ll inversions(const vector<ll>& v) {
Tree<pair<ll, ll>> t; //ordered statistics tree @\sourceref{datastructures/pbds.cpp}@
ll res = 0;
- for (ll i = 0; i < sz(v); i++) {
+ for (ll i = 0; i < ssize(v); i++) {
res += i - t.order_of_key({v[i], i});
t.insert({v[i], i});
}
diff --git a/content/math/inversionsMerge.cpp b/content/math/inversionsMerge.cpp
index 8235b11..50fe37b 100644
--- a/content/math/inversionsMerge.cpp
+++ b/content/math/inversionsMerge.cpp
@@ -2,26 +2,26 @@
ll merge(vector<ll>& v, vector<ll>& left, vector<ll>& right) {
int a = 0, b = 0, i = 0;
ll inv = 0;
- while (a < sz(left) && b < sz(right)) {
+ while (a < ssize(left) && b < ssize(right)) {
if (left[a] < right[b]) v[i++] = left[a++];
else {
- inv += sz(left) - a;
+ inv += ssize(left) - a;
v[i++] = right[b++];
}
}
- while (a < sz(left)) v[i++] = left[a++];
- while (b < sz(right)) v[i++] = right[b++];
+ while (a < ssize(left)) v[i++] = left[a++];
+ while (b < ssize(right)) v[i++] = right[b++];
return inv;
}
ll mergeSort(vector<ll> &v) { // Sortiert v und gibt Inversionszahl zurück.
- int n = sz(v);
+ int n = ssize(v);
vector<ll> left(n / 2), right((n + 1) / 2);
for (int i = 0; i < n / 2; i++) left[i] = v[i];
for (int i = n / 2; i < n; i++) right[i - n / 2] = v[i];
ll result = 0;
- if (sz(left) > 1) result += mergeSort(left);
- if (sz(right) > 1) result += mergeSort(right);
+ if (ssize(left) > 1) result += mergeSort(left);
+ if (ssize(right) > 1) result += mergeSort(right);
return result + merge(v, left, right);
}
diff --git a/content/math/lgsFp.cpp b/content/math/lgsFp.cpp
index bf18c86..64e4c09 100644
--- a/content/math/lgsFp.cpp
+++ b/content/math/lgsFp.cpp
@@ -7,7 +7,7 @@ void takeAll(int n, int line, ll p) {
for (int i = 0; i < n; i++) {
if (i == line) continue;
ll diff = mat[i][line];
- for (int j = 0; j < sz(mat[i]); j++) {
+ for (int j = 0; j < ssize(mat[i]); j++) {
mat[i][j] -= (diff * mat[line][j]) % p;
mat[i][j] = (mat[i][j] + p) % p;
}}}
diff --git a/content/math/linearRecurrence.cpp b/content/math/linearRecurrence.cpp
index a8adacd..eb04566 100644
--- a/content/math/linearRecurrence.cpp
+++ b/content/math/linearRecurrence.cpp
@@ -1,9 +1,9 @@
constexpr ll mod = 998244353;
// oder ntt mul @\sourceref{math/transforms/ntt.cpp}@
vector<ll> mul(const vector<ll>& a, const vector<ll>& b) {
- vector<ll> c(sz(a) + sz(b) - 1);
- for (int i = 0; i < sz(a); i++) {
- for (int j = 0; j < sz(b); j++) {
+ vector<ll> c(ssize(a) + ssize(b) - 1);
+ for (int i = 0; i < ssize(a); i++) {
+ for (int j = 0; j < ssize(b); j++) {
c[i+j] += a[i]*b[j] % mod;
}}
for (ll& x : c) x %= mod;
@@ -11,7 +11,7 @@ vector<ll> mul(const vector<ll>& a, const vector<ll>& b) {
}
ll kthTerm(const vector<ll>& f, const vector<ll>& c, ll k) {
- int n = sz(c);
+ int n = ssize(c);
vector<ll> q(n + 1, 1);
for (int i = 0; i < n; i++) q[i + 1] = (mod - c[i]) % mod;
vector<ll> p = mul(f, q);
diff --git a/content/math/linearRecurrenceOld.cpp b/content/math/linearRecurrenceOld.cpp
index 2501e64..f67398d 100644
--- a/content/math/linearRecurrenceOld.cpp
+++ b/content/math/linearRecurrenceOld.cpp
@@ -1,7 +1,7 @@
constexpr ll mod = 1'000'000'007;
vector<ll> modMul(const vector<ll>& a, const vector<ll>& b,
const vector<ll>& c) {
- ll n = sz(c);
+ ll n = ssize(c);
vector<ll> res(n * 2 + 1);
for (int i = 0; i <= n; i++) { //a*b
for (int j = 0; j <= n; j++) {
@@ -18,8 +18,8 @@ vector<ll> modMul(const vector<ll>& a, const vector<ll>& b,
}
ll kthTerm(const vector<ll>& f, const vector<ll>& c, ll k) {
- assert(sz(f) == sz(c));
- vector<ll> tmp(sz(c) + 1), a(sz(c) + 1);
+ assert(ssize(f) == ssize(c));
+ vector<ll> tmp(ssize(c) + 1), a(ssize(c) + 1);
tmp[0] = a[1] = 1; //tmp = (x^k) % c
for (k++; k > 0; k /= 2) {
@@ -28,6 +28,6 @@ ll kthTerm(const vector<ll>& f, const vector<ll>& c, ll k) {
}
ll res = 0;
- for (int i = 0; i < sz(c); i++) res += (tmp[i+1] * f[i]) % mod;
+ for (int i = 0; i < ssize(c); i++) res += (tmp[i+1] * f[i]) % mod;
return res % mod;
}
diff --git a/content/math/longestIncreasingSubsequence.cpp b/content/math/longestIncreasingSubsequence.cpp
index fcb63b4..e4863d0 100644
--- a/content/math/longestIncreasingSubsequence.cpp
+++ b/content/math/longestIncreasingSubsequence.cpp
@@ -1,8 +1,8 @@
vector<int> lis(vector<ll>& a) {
- int n = sz(a), len = 0;
+ int n = ssize(a), len = 0;
vector<ll> dp(n, INF), dp_id(n), prev(n);
for (int i = 0; i < n; i++) {
- int pos = lower_bound(all(dp), a[i]) - dp.begin();
+ int pos = ranges::lower_bound(dp, a[i]) - begin(dp);
dp[pos] = a[i];
dp_id[pos] = i;
prev[i] = pos ? dp_id[pos - 1] : -1;
diff --git a/content/math/matrixPower.cpp b/content/math/matrixPower.cpp
index d981e6e..0729c15 100644
--- a/content/math/matrixPower.cpp
+++ b/content/math/matrixPower.cpp
@@ -1,7 +1,7 @@
vector<mat> pows;
void precalc(mat m) {
- pows = {mat(sz(m.m), 1), m};
+ pows = {mat(ssize(m.m), 1), m};
for (int i = 1; i < 60; i++) pows.push_back(pows[i] * pows[i]);
}
diff --git a/content/math/permIndex.cpp b/content/math/permIndex.cpp
index 4cffc12..563b33a 100644
--- a/content/math/permIndex.cpp
+++ b/content/math/permIndex.cpp
@@ -1,12 +1,12 @@
ll permIndex(vector<ll> v) {
Tree<ll> t;
- reverse(all(v));
+ ranges::reverse(v);
for (ll& x : v) {
t.insert(x);
x = t.order_of_key(x);
}
ll res = 0;
- for (int i = sz(v); i > 0; i--) {
+ for (int i = ssize(v); i > 0; i--) {
res = res * i + v[i - 1];
}
return res;
diff --git a/content/math/piLegendre.cpp b/content/math/piLegendre.cpp
index 46c8584..6401a4f 100644
--- a/content/math/piLegendre.cpp
+++ b/content/math/piLegendre.cpp
@@ -16,7 +16,7 @@ ll phi(ll n, ll k) {
ll pi(ll n) {
if (n < N) { // implement this as O(1) lookup for speedup!
- return distance(primes.begin(), upper_bound(all(primes), n));
+ return ranges::upper_bound(primes, n) - begin(primes);
} else {
ll k = pi(sqrtl(n) + 1);
return n - phi(n, k) + k;
diff --git a/content/math/polynomial.cpp b/content/math/polynomial.cpp
index 4698a00..12a4fd7 100644
--- a/content/math/polynomial.cpp
+++ b/content/math/polynomial.cpp
@@ -4,7 +4,7 @@ struct poly {
poly(int deg = 0) : data(1 + deg) {}
poly(initializer_list<ll> _data) : data(_data) {}
- int size() const { return sz(data); }
+ int size() const { return ssize(data); }
void trim() {
for (ll& x : data) x = (x % mod + mod) % mod;
diff --git a/content/math/transforms/andTransform.cpp b/content/math/transforms/andTransform.cpp
index 1fd9f5c..1e9cfc0 100644
--- a/content/math/transforms/andTransform.cpp
+++ b/content/math/transforms/andTransform.cpp
@@ -1,5 +1,5 @@
void fft(vector<ll>& a, bool inv = false) {
- int n = sz(a);
+ int n = ssize(a);
for (int s = 1; s < n; s *= 2) {
for (int i = 0; i < n; i += 2 * s) {
for (int j = i; j < i + s; j++) {
diff --git a/content/math/transforms/bitwiseTransforms.cpp b/content/math/transforms/bitwiseTransforms.cpp
index 28561da..b98ea94 100644
--- a/content/math/transforms/bitwiseTransforms.cpp
+++ b/content/math/transforms/bitwiseTransforms.cpp
@@ -1,5 +1,5 @@
void bitwiseConv(vector<ll>& a, bool inv = false) {
- int n = sz(a);
+ int n = ssize(a);
for (int s = 1; s < n; s *= 2) {
for (int i = 0; i < n; i += 2 * s) {
for (int j = i; j < i + s; j++) {
diff --git a/content/math/transforms/fft.cpp b/content/math/transforms/fft.cpp
index 2bd95b2..1f80e36 100644
--- a/content/math/transforms/fft.cpp
+++ b/content/math/transforms/fft.cpp
@@ -1,7 +1,7 @@
using cplx = complex<double>;
void fft(vector<cplx>& a, bool inv = false) {
- int n = sz(a);
+ int n = ssize(a);
for (int i = 0, j = 1; j < n - 1; ++j) {
for (int k = n >> 1; k > (i ^= k); k >>= 1);
if (j < i) swap(a[i], a[j]);
diff --git a/content/math/transforms/fftMul.cpp b/content/math/transforms/fftMul.cpp
index 660ed79..da6a538 100644
--- a/content/math/transforms/fftMul.cpp
+++ b/content/math/transforms/fftMul.cpp
@@ -1,8 +1,8 @@
vector<cplx> mul(vector<ll>& a, vector<ll>& b) {
- int n = 1 << (__lg(sz(a) + sz(b) - 1) + 1);
- vector<cplx> c(all(a)), d(n);
+ int n = 1 << (__lg(ssize(a) + ssize(b) - 1) + 1);
+ vector<cplx> c(begin(a), end(a)), d(n);
c.resize(n);
- for (int i = 0; i < sz(b); i++) c[i] = {real(c[i]), b[i]};
+ for (int i = 0; i < ssize(b); i++) c[i] = {real(c[i]), b[i]};
fft(c);
for (int i = 0; i < n; i++) {
int j = (n - i) & (n - 1);
diff --git a/content/math/transforms/multiplyBitwise.cpp b/content/math/transforms/multiplyBitwise.cpp
index f7cf169..5275b8c 100644
--- a/content/math/transforms/multiplyBitwise.cpp
+++ b/content/math/transforms/multiplyBitwise.cpp
@@ -1,5 +1,5 @@
vector<ll> mul(vector<ll> a, vector<ll> b) {
- int n = 1 << (__lg(2 * max(sz(a), sz(b)) - 1));
+ int n = 1 << (__lg(2 * max(ssize(a), ssize(b)) - 1));
a.resize(n), b.resize(n);
bitwiseConv(a), bitwiseConv(b);
for (int i=0; i<n; i++) a[i] *= b[i]; // MOD?
diff --git a/content/math/transforms/multiplyFFT.cpp b/content/math/transforms/multiplyFFT.cpp
index 0022d1f..963be94 100644
--- a/content/math/transforms/multiplyFFT.cpp
+++ b/content/math/transforms/multiplyFFT.cpp
@@ -1,6 +1,6 @@
vector<ll> mul(vector<ll>& a, vector<ll>& b) {
- int n = 1 << (__lg(sz(a) + sz(b) - 1) + 1);
- vector<cplx> a2(all(a)), b2(all(b));
+ int n = 1 << (__lg(ssize(a) + ssize(b) - 1) + 1);
+ vector<cplx> a2(begin(a), end(a)), b2(begin(b), end(b));
a2.resize(n), b2.resize(n);
fft(a2), fft(b2);
for (int i=0; i<n; i++) a2[i] *= b2[i];
diff --git a/content/math/transforms/multiplyNTT.cpp b/content/math/transforms/multiplyNTT.cpp
index 806d124..aec2a61 100644
--- a/content/math/transforms/multiplyNTT.cpp
+++ b/content/math/transforms/multiplyNTT.cpp
@@ -1,5 +1,5 @@
vector<ll> mul(vector<ll> a, vector<ll> b) {
- int n = 1 << (__lg(sz(a) + sz(b) - 1) + 1);
+ int n = 1 << (__lg(ssize(a) + ssize(b) - 1) + 1);
a.resize(n), b.resize(n);
ntt(a), ntt(b);
for (int i=0; i<n; i++) a[i] = a[i] * b[i] % mod;
diff --git a/content/math/transforms/ntt.cpp b/content/math/transforms/ntt.cpp
index ca605d3..fc7874e 100644
--- a/content/math/transforms/ntt.cpp
+++ b/content/math/transforms/ntt.cpp
@@ -1,7 +1,7 @@
constexpr ll mod = 998244353, root = 3;
void ntt(vector<ll>& a, bool inv = false) {
- int n = sz(a);
+ int n = ssize(a);
auto b = a;
ll r = inv ? powMod(root, mod - 2, mod) : root;
diff --git a/content/math/transforms/orTransform.cpp b/content/math/transforms/orTransform.cpp
index eb1da44..d0122bf 100644
--- a/content/math/transforms/orTransform.cpp
+++ b/content/math/transforms/orTransform.cpp
@@ -1,5 +1,5 @@
void fft(vector<ll>& a, bool inv = false) {
- int n = sz(a);
+ int n = ssize(a);
for (int s = 1; s < n; s *= 2) {
for (int i = 0; i < n; i += 2 * s) {
for (int j = i; j < i + s; j++) {
diff --git a/content/math/transforms/seriesOperations.cpp b/content/math/transforms/seriesOperations.cpp
index b405698..3d8aa11 100644
--- a/content/math/transforms/seriesOperations.cpp
+++ b/content/math/transforms/seriesOperations.cpp
@@ -17,7 +17,7 @@ vector<ll> poly_inv(const vector<ll>& a, int n) {
}
vector<ll> poly_deriv(vector<ll> a) {
- for (int i = 1; i < sz(a); i++)
+ for (int i = 1; i < ssize(a); i++)
a[i-1] = a[i] * i % mod;
a.pop_back();
return a;
@@ -25,11 +25,11 @@ vector<ll> poly_deriv(vector<ll> a) {
vector<ll> poly_integr(vector<ll> a) {
static vector<ll> inv = {0, 1};
- for (static int i = 2; i <= sz(a); i++)
+ for (static int i = 2; i <= ssize(a); i++)
inv.push_back(mod - mod / i * inv[mod % i] % mod);
a.push_back(0);
- for (int i = sz(a) - 1; i > 0; i--)
+ for (int i = ssize(a) - 1; i > 0; i--)
a[i] = a[i-1] * inv[i] % mod;
a[0] = 0;
return a;
@@ -46,7 +46,7 @@ vector<ll> poly_exp(vector<ll> a, int n) {
for (int len = 1; len < n; len *= 2) {
vector<ll> p = poly_log(q, 2*len);
for (int i = 0; i < 2*len; i++)
- p[i] = (mod - p[i] + (i < sz(a) ? a[i] : 0)) % mod;
+ p[i] = (mod - p[i] + (i < ssize(a) ? a[i] : 0)) % mod;
vector<ll> q2 = q;
q2.resize(2*len);
ntt(p), ntt(q2);
diff --git a/content/math/transforms/xorTransform.cpp b/content/math/transforms/xorTransform.cpp
index f9d1d82..075aac3 100644
--- a/content/math/transforms/xorTransform.cpp
+++ b/content/math/transforms/xorTransform.cpp
@@ -1,5 +1,5 @@
void fft(vector<ll>& a, bool inv = false) {
- int n = sz(a);
+ int n = ssize(a);
for (int s = 1; s < n; s *= 2) {
for (int i = 0; i < n; i += 2 * s) {
for (int j = i; j < i + s; j++) {
diff --git a/content/other/fastSubsetSum.cpp b/content/other/fastSubsetSum.cpp
index 84396f6..38a84b6 100644
--- a/content/other/fastSubsetSum.cpp
+++ b/content/other/fastSubsetSum.cpp
@@ -1,11 +1,11 @@
int fastSubsetSum(vector<int> w, int t){
int a = 0, b = 0;
- while(b < sz(w) && a + w[b] <= t) a += w[b++];
- if(b == sz(w)) return a;
- int m = *max_element(all(w));
+ while(b < ssize(w) && a + w[b] <= t) a += w[b++];
+ if(b == ssize(w)) return a;
+ int m = *ranges::max_element(w);
vector<int> dp(2*m, -1), old;
dp[m+a-t] = b;
- for(int i = b; i < sz(w); i++){
+ for(int i = b; i < ssize(w); i++){
old = dp;
for(int j = 0; j < m; j++){
dp[j+w[i]] = max(dp[j+w[i]], old[j]);
@@ -18,4 +18,4 @@ int fastSubsetSum(vector<int> w, int t){
}
for(a = t; dp[m+a-t] < 0; a--);
return a;
-} \ No newline at end of file
+}
diff --git a/content/other/pbs.cpp b/content/other/pbs.cpp
index f4db2fd..e6bfeac 100644
--- a/content/other/pbs.cpp
+++ b/content/other/pbs.cpp
@@ -7,7 +7,7 @@ while (true) {
focus.emplace_back((low[i] + high[i]) / 2, i);
}}
if (focus.empty()) break;
- sort(all(focus));
+ ranges::sort(focus);
// reset simulation
for (int step = 0; auto [mid, i] : focus) {
diff --git a/content/other/sos.cpp b/content/other/sos.cpp
index 01bc44c..892a47c 100644
--- a/content/other/sos.cpp
+++ b/content/other/sos.cpp
@@ -1,6 +1,6 @@
vector<ll> res(in);
-for (int i = 1; i < sz(res); i *= 2) {
- for (int mask = 0; mask < sz(res); mask++){
+for (int i = 1; i < ssize(res); i *= 2) {
+ for (int mask = 0; mask < ssize(res); mask++){
if (mask & i) {
res[mask] += res[mask ^ i];
}}}
diff --git a/content/string/ahoCorasick.cpp b/content/string/ahoCorasick.cpp
index c65e20a..d738961 100644
--- a/content/string/ahoCorasick.cpp
+++ b/content/string/ahoCorasick.cpp
@@ -4,7 +4,8 @@ struct AhoCorasick {
int suffix = 0, ch, cnt = 0;
array<int, ALPHABET_SIZE> nxt = {};
- vert(int p, int c): suffix(-p), ch(c) { fill(all(nxt), -1); }
+ vert(int p, int c):
+ suffix(-p), ch(c) { ranges::fill(nxt, -1); }
};
vector<vert> aho = {{0, -1}};
@@ -13,7 +14,7 @@ struct AhoCorasick {
for (auto c : s) {
int idx = c - OFFSET;
if (aho[v].nxt[idx] == -1) {
- aho[v].nxt[idx] = sz(aho);
+ aho[v].nxt[idx] = ssize(aho);
aho.emplace_back(v, idx);
}
v = aho[v].nxt[idx];
@@ -37,9 +38,9 @@ struct AhoCorasick {
vector<vector<int>> adj;
vector<ll> dp;
void buildGraph() {
- adj.resize(sz(aho));
- dp.assign(sz(aho), 0);
- for (int i = 1; i < sz(aho); i++) {
+ adj.resize(ssize(aho));
+ dp.assign(ssize(aho), 0);
+ for (int i = 1; i < ssize(aho); i++) {
adj[getSuffix(i)].push_back(i);
}}
diff --git a/content/string/deBruijn.cpp b/content/string/deBruijn.cpp
index e829137..545dde7 100644
--- a/content/string/deBruijn.cpp
+++ b/content/string/deBruijn.cpp
@@ -1,7 +1,7 @@
string deBruijn(int n, char mi = '0', char ma = '1') {
string res, c(1, mi);
do {
- if (n % sz(c) == 0) res += c;
+ if (n % ssize(c) == 0) res += c;
} while(next(c, n, mi, ma));
return res;
}
diff --git a/content/string/duval.cpp b/content/string/duval.cpp
index 253bae1..de94ebd 100644
--- a/content/string/duval.cpp
+++ b/content/string/duval.cpp
@@ -1,8 +1,8 @@
vector<pair<int, int>> duval(const string& s) {
vector<pair<int, int>> res;
- for (int i = 0; i < sz(s);) {
+ for (int i = 0; i < ssize(s);) {
int j = i + 1, k = i;
- for (; j < sz(s) && s[k] <= s[j]; j++) {
+ for (; j < ssize(s) && s[k] <= s[j]; j++) {
if (s[k] < s[j]) k = i;
else k++;
}
@@ -15,5 +15,5 @@ vector<pair<int, int>> duval(const string& s) {
int minrotation(const string& s) {
auto parts = duval(s+s);
for (auto [l, r] : parts) {
- if (r >= sz(s)) return l;
+ if (r >= ssize(s)) return l;
}}
diff --git a/content/string/kmp.cpp b/content/string/kmp.cpp
index 421479e..a354aa7 100644
--- a/content/string/kmp.cpp
+++ b/content/string/kmp.cpp
@@ -1,7 +1,7 @@
vector<int> kmpPreprocessing(const string& sub) {
- vector<int> b(sz(sub) + 1);
+ vector<int> b(ssize(sub) + 1);
b[0] = -1;
- for (int i = 0, j = -1; i < sz(sub);) {
+ for (int i = 0, j = -1; i < ssize(sub);) {
while (j >= 0 && sub[i] != sub[j]) j = b[j];
b[++i] = ++j;
}
@@ -9,10 +9,10 @@ vector<int> kmpPreprocessing(const string& sub) {
}
vector<int> kmpSearch(const string& s, const string& sub) {
vector<int> result, pre = kmpPreprocessing(sub);
- for (int i = 0, j = 0; i < sz(s);) {
+ for (int i = 0, j = 0; i < ssize(s);) {
while (j >= 0 && s[i] != sub[j]) j = pre[j];
i++; j++;
- if (j == sz(sub)) {
+ if (j == ssize(sub)) {
result.push_back(i - j);
j = pre[j];
}}
diff --git a/content/string/longestCommonSubsequence.cpp b/content/string/longestCommonSubsequence.cpp
index 6c9ea44..14ca62c 100644
--- a/content/string/longestCommonSubsequence.cpp
+++ b/content/string/longestCommonSubsequence.cpp
@@ -1,12 +1,12 @@
string lcss(const string& a, const string& b) {
- vector<vector<int>> m(sz(a) + 1, vector<int>(sz(b) + 1));
- for (int i = sz(a) - 1; i >= 0; i--) {
- for (int j = sz(b) - 1; j >= 0; j--) {
+ vector<vector<int>> m(ssize(a) + 1, vector<int>(ssize(b) + 1));
+ for (int i = ssize(a) - 1; i >= 0; i--) {
+ for (int j = ssize(b) - 1; j >= 0; j--) {
if (a[i] == b[j]) m[i][j] = 1 + m[i+1][j+1];
else m[i][j] = max(m[i+1][j], m[i][j+1]);
}} // Für die Länge: return m[0][0];
string res;
- for (int j = 0, i = 0; j < sz(b) && i < sz(a);) {
+ for (int j = 0, i = 0; j < ssize(b) && i < ssize(a);) {
if (a[i] == b[j]) res += a[i++], j++;
else if (m[i][j+1] > m[i+1][j]) j++;
else i++;
diff --git a/content/string/lyndon.cpp b/content/string/lyndon.cpp
index e44379b..cb477d4 100644
--- a/content/string/lyndon.cpp
+++ b/content/string/lyndon.cpp
@@ -1,5 +1,5 @@
bool next(string& s, int maxLen, char mi = '0', char ma = '1') {
- for (int i = sz(s), j = sz(s); i < maxLen; i++)
+ for (int i = ssize(s), j = ssize(s); i < maxLen; i++)
s.push_back(s[i % j]);
while(!s.empty() && s.back() == ma) s.pop_back();
if (s.empty()) {
diff --git a/content/string/manacher.cpp b/content/string/manacher.cpp
index 112bd55..9fa2991 100644
--- a/content/string/manacher.cpp
+++ b/content/string/manacher.cpp
@@ -1,9 +1,9 @@
vector<int> manacher(const string& t) {
//transforms "aa" to ".a.a." to find even length palindromes
- string s(sz(t) * 2 + 1, '.');
- for (int i = 0; i < sz(t); i++) s[2 * i + 1] = t[i];
+ string s(ssize(t) * 2 + 1, '.');
+ for (int i = 0; i < ssize(t); i++) s[2 * i + 1] = t[i];
- int mid = 0, r = 0, n = sz(s);
+ int mid = 0, r = 0, n = ssize(s);
vector<int> pal(n);
for (int i = 1; i < n - 1; i++) {
if (r > i) pal[i] = min(r - i, pal[2 * mid - i]);
diff --git a/content/string/suffixArray.cpp b/content/string/suffixArray.cpp
index 0e301b2..c49bdc9 100644
--- a/content/string/suffixArray.cpp
+++ b/content/string/suffixArray.cpp
@@ -4,19 +4,19 @@ struct SuffixArray {
vector<int> SA, LCP;
vector<vector<int>> P;
- SuffixArray(const string& s) : n(sz(s)), SA(n), LCP(n),
+ SuffixArray(const string& s) : n(ssize(s)), SA(n), LCP(n),
P(__lg(2 * n - 1) + 1, vector<int>(n)) {
- P[0].assign(all(s));
- iota(all(SA), 0);
- sort(all(SA), [&](int a, int b) { return s[a] < s[b]; });
+ P[0].assign(begin(s), end(s));
+ iota(begin(SA), end(SA), 0);
+ ranges::sort(SA, {}, [&](int x) { return s[x]; });
vector<int> x(n);
for (int k = 1, c = 1; c < n; k++, c *= 2) {
- iota(all(x), n - c);
+ iota(begin(x), end(x), n - c);
for (int ptr = c; int i : SA) if (i >= c) x[ptr++] = i - c;
vector<int> cnt(k == 1 ? MAX_CHAR : n);
for (int i : P[k-1]) cnt[i]++;
- partial_sum(all(cnt), begin(cnt));
+ partial_sum(begin(cnt), end(cnt), begin(cnt));
for (int i : x | views::reverse) SA[--cnt[P[k-1][i]]] = i;
auto p = [&](int i) { return i < n ? P[k-1][i] : -1; };
@@ -31,7 +31,7 @@ struct SuffixArray {
int lcp(int x, int y) {
if (x == y) return n - x;
int res = 0;
- for (int i = sz(P) - 1; i >= 0 && max(x, y) + res < n; i--) {
+ for (int i = ssize(P) - 1; i >= 0 && max(x, y) + res < n; i--) {
if (P[i][x + res] == P[i][y + res]) res |= 1 << i;
}
return res;
diff --git a/content/string/suffixAutomaton.cpp b/content/string/suffixAutomaton.cpp
index d81a05d..f9aa80b 100644
--- a/content/string/suffixAutomaton.cpp
+++ b/content/string/suffixAutomaton.cpp
@@ -4,20 +4,20 @@ struct SuffixAutomaton {
struct State {
int len, link = -1;
array<int, ALPHABET_SIZE> nxt; // map if large Alphabet
- State(int l): len(l) { fill(all(nxt), -1); }
+ State(int l): len(l) { ranges::fill(nxt, -1); }
};
vector<State> st = {State(0)};
int cur = 0;
SuffixAutomaton(const string& s) {
- st.reserve(2 * sz(s));
+ st.reserve(2 * ssize(s));
for (auto c : s) extend(c - OFFSET);
}
void extend(int c) {
int p = cur;
- cur = sz(st);
+ cur = ssize(st);
st.emplace_back(st[p].len + 1);
for (; p != -1 && st[p].nxt[c] < 0; p = st[p].link) {
st[p].nxt[c] = cur;
@@ -33,9 +33,9 @@ struct SuffixAutomaton {
st.back().link = st[q].link;
st.back().nxt = st[q].nxt;
for (; p != -1 && st[p].nxt[c] == q; p = st[p].link) {
- st[p].nxt[c] = sz(st) - 1;
+ st[p].nxt[c] = ssize(st) - 1;
}
- st[q].link = st[cur].link = sz(st) - 1;
+ st[q].link = st[cur].link = ssize(st) - 1;
}}}
vector<int> calculateTerminals() {
@@ -49,7 +49,7 @@ struct SuffixAutomaton {
// Pair with start index (in t) and length of LCS.
pair<int, int> longestCommonSubstring(const string& t) {
int v = 0, l = 0, best = 0, bestp = -1;
- for (int i = 0; i < sz(t); i++) {
+ for (int i = 0; i < ssize(t); i++) {
int c = t[i] - OFFSET;
while (v > 0 && st[v].nxt[c] < 0) {
v = st[v].link;
diff --git a/content/string/suffixTree.cpp b/content/string/suffixTree.cpp
index 7112f39..6362c3e 100644
--- a/content/string/suffixTree.cpp
+++ b/content/string/suffixTree.cpp
@@ -11,12 +11,12 @@ struct SuffixTree {
SuffixTree(const string& s_) : s(s_) {
needsSuffix = remainder = curVert = curEdge = curLen = 0;
pos = -1;
- for (int i = 0; i < sz(s); i++) extend();
+ for (int i = 0; i < ssize(s); i++) extend();
}
int newVert(int start, int end) {
tree.push_back({start, end, 0, {}});
- return sz(tree) - 1;
+ return ssize(tree) - 1;
}
void addSuffixLink(int vert) {
@@ -42,7 +42,7 @@ struct SuffixTree {
while (remainder) {
if (curLen == 0) curEdge = pos;
if (!tree[curVert].nxt.count(s[curEdge])) {
- int leaf = newVert(pos, sz(s));
+ int leaf = newVert(pos, ssize(s));
tree[curVert].nxt[s[curEdge]] = leaf;
addSuffixLink(curVert);
} else {
@@ -56,7 +56,7 @@ struct SuffixTree {
int split = newVert(tree[nxt].start,
tree[nxt].start + curLen);
tree[curVert].nxt[s[curEdge]] = split;
- int leaf = newVert(pos, sz(s));
+ int leaf = newVert(pos, ssize(s));
tree[split].nxt[s[pos]] = leaf;
tree[nxt].start += curLen;
tree[split].nxt[s[tree[nxt].start]] = nxt;
@@ -69,4 +69,4 @@ struct SuffixTree {
} else {
curVert = tree[curVert].suf ? tree[curVert].suf : 0;
}}}
-}; \ No newline at end of file
+};
diff --git a/content/string/trie.cpp b/content/string/trie.cpp
index d5e092c..db39c43 100644
--- a/content/string/trie.cpp
+++ b/content/string/trie.cpp
@@ -3,7 +3,7 @@ constexpr int ALPHABET_SIZE = 2;
struct node {
int words, ends;
array<int, ALPHABET_SIZE> nxt;
- node(): words(0), ends(0) { fill(all(nxt), -1); }
+ node(): words(0), ends(0) { ranges::fill(nxt, -1); }
};
vector<node> trie = {node()};
@@ -13,7 +13,7 @@ int traverse(const vector<int>& word, int x) {
if (id < 0 || (trie[id].words == 0 && x <= 0)) return -1;
trie[id].words += x;
if (trie[id].nxt[c] < 0 && x > 0) {
- trie[id].nxt[c] = sz(trie);
+ trie[id].nxt[c] = ssize(trie);
trie.emplace_back();
}
id = trie[id].nxt[c];
diff --git a/content/string/z.cpp b/content/string/z.cpp
index 069fa38..0d8cafb 100644
--- a/content/string/z.cpp
+++ b/content/string/z.cpp
@@ -1,5 +1,5 @@
vector<int> Z(const string& s) {
- int n = sz(s);
+ int n = ssize(s);
vector<int> z(n);
for (int i = 1, x = 0; i < n; i++) {
z[i] = max(0, min(z[i - x], x + z[x] - i));
diff --git a/content/template/template.cpp b/content/template/template.cpp
index 7430d23..7c92f09 100644
--- a/content/template/template.cpp
+++ b/content/template/template.cpp
@@ -1,17 +1,15 @@
#include <bits/stdc++.h>
using namespace std;
-#define tsolve int t; cin >> t; while(t--) solve
-#define all(x) ::begin(x), ::end(x)
-#define sz(x) (ll)::size(x)
-
+using ii = pair<int, int>;
+using vi = vector<int>;
using ll = long long;
using ld = long double;
-void solve() {}
+void solve() {
+}
int main() {
- cin.tie(0)->sync_with_stdio(false);
- cout << setprecision(16);
+ cin.tie(0)->sync_with_stdio(0);
solve();
}