maomao90's Library
A C++20 library for competitive programming.
Loading...
Searching...
No Matches
standard_monoids.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <concepts>
4#include <limits>
5#include <tuple>
6#include <utility>
7
8namespace maomao90 {
9using namespace std;
10
11template <typename T>
12concept Monoid = requires(const T &a, const T &b) {
13 { T::id() } -> same_as<T>;
14 { a.merge(b) } -> same_as<T>;
15};
16
17template <typename L, typename T>
18concept Lazy = requires(const L &lz, const T &x, const int len) {
19 { lz.apply(x, len) } -> same_as<T>;
20 requires Monoid<L>;
21};
22
24const bool MIN_FLAG = true, MAX_FLAG = false;
25template <bool is_min, typename T> struct limits;
26template <bool is_min, typename T>
28
29template <integral T> struct limits<true, T> {
30 static constexpr T value = numeric_limits<T>::min() / 2;
31};
32template <integral T> struct limits<false, T> {
33 static constexpr T value = numeric_limits<T>::max() / 2;
34};
35template <> struct limits<MIN_FLAG, __int128> {
36 static constexpr __int128 value = (__int128)numeric_limits<long long>::min() /
37 2 * numeric_limits<long long>::max() / 2;
38};
39template <> struct limits<MAX_FLAG, __int128> {
40 static constexpr __int128 value = (__int128)numeric_limits<long long>::max() /
41 2 * numeric_limits<long long>::max() / 2;
42};
43
44template <bool is_min, typename A, typename B>
45struct limits<is_min, pair<A, B>> {
46 static constexpr pair<A, B> value =
48};
49
50template <bool is_min, typename Head, typename... Tail>
51struct limits<is_min, tuple<Head, Tail...>> {
52 static constexpr tuple<Head, Tail...> value = tuple_cat(
53 make_tuple(limits_v<is_min, Head>), limits_v<is_min, tuple<Tail...>>);
54};
55template <bool is_min> struct limits<is_min, tuple<>> {
56 static constexpr tuple<> value = make_tuple();
57};
58} // namespace internal::monoid
59
60template <typename T> struct MinMonoid {
61 T v;
65 MinMonoid merge(const MinMonoid &o) const { return {min(v, o.v)}; }
66};
67template <typename T> struct MaxMonoid {
68 T v;
72 MaxMonoid merge(const MaxMonoid &o) const { return {max(v, o.v)}; }
73};
74template <typename T> struct SumMonoid {
75 T v;
76 static SumMonoid id() { return {T(0)}; }
77 SumMonoid merge(const SumMonoid &o) const { return {v + o.v}; }
78};
79
88template <typename T> struct ValueMonoid {
89 T v;
90 static ValueMonoid id() { return {T()}; }
91 ValueMonoid merge(const ValueMonoid &o) const { return ValueMonoid::id(); }
92};
93
98template <typename T> struct NoLazy {
99 static NoLazy id() { return {}; }
100 NoLazy merge(const NoLazy &o) const { return {}; }
101 T apply(const T &o, const int len) const { return o; }
102};
103} // namespace maomao90
Definition standard_monoids.hpp:18
Definition standard_monoids.hpp:12
Definition standard_monoids.hpp:23
const bool MAX_FLAG
Definition standard_monoids.hpp:24
constexpr T limits_v
Definition standard_monoids.hpp:27
const bool MIN_FLAG
Definition standard_monoids.hpp:24
Definition hashmap.hpp:8
Definition standard_monoids.hpp:67
static MaxMonoid id()
Definition standard_monoids.hpp:69
T v
Definition standard_monoids.hpp:68
MaxMonoid merge(const MaxMonoid &o) const
Definition standard_monoids.hpp:72
Definition standard_monoids.hpp:60
MinMonoid merge(const MinMonoid &o) const
Definition standard_monoids.hpp:65
T v
Definition standard_monoids.hpp:61
static MinMonoid id()
Definition standard_monoids.hpp:62
Lazy that does not apply any updates.
Definition standard_monoids.hpp:98
T apply(const T &o, const int len) const
Definition standard_monoids.hpp:101
static NoLazy id()
Definition standard_monoids.hpp:99
NoLazy merge(const NoLazy &o) const
Definition standard_monoids.hpp:100
Definition standard_monoids.hpp:74
SumMonoid merge(const SumMonoid &o) const
Definition standard_monoids.hpp:77
T v
Definition standard_monoids.hpp:75
static SumMonoid id()
Definition standard_monoids.hpp:76
Only stores a value, and does not have a binary operation.
Definition standard_monoids.hpp:88
ValueMonoid merge(const ValueMonoid &o) const
Definition standard_monoids.hpp:91
static ValueMonoid id()
Definition standard_monoids.hpp:90
T v
Definition standard_monoids.hpp:89
static constexpr __int128 value
Definition standard_monoids.hpp:40
static constexpr __int128 value
Definition standard_monoids.hpp:36
static constexpr T value
Definition standard_monoids.hpp:33
static constexpr pair< A, B > value
Definition standard_monoids.hpp:46
static constexpr tuple< Head, Tail... > value
Definition standard_monoids.hpp:52
static constexpr tuple value
Definition standard_monoids.hpp:56
static constexpr T value
Definition standard_monoids.hpp:30
Definition standard_monoids.hpp:25