ecnerwala's competitive programming library
#include "cnt_min.hpp"
| Coverage | Exec / Excl / Total | |
|---|---|---|
| Lines | 0.0% | 0 / 0 / 11 |
| Full report |
#pragma once
#include "reverse_comparator.hpp"
template <typename T, typename C = int, typename Comp = std::less<T>> struct cnt_min {
T v;
C cnt;
cnt_min() : v(), cnt(0) {}
explicit cnt_min(T v_) : v(v_), cnt(1) {}
cnt_min(T v_, C cnt_) : v(v_), cnt(cnt_) {}
friend cnt_min operator + (const cnt_min& a, const cnt_min& b) {
if (!b.cnt) return a;
else if (!a.cnt) return b;
else if (Comp().operator()(a.v, b.v)) return a;
else if (Comp().operator()(b.v, a.v)) return b;
else return cnt_min(a.v, a.cnt + b.cnt);
}
cnt_min& operator += (const cnt_min& o) {
return *this = (*this + o);
}
};
template <typename T, typename C = int, typename Comp = std::less<T>> using cnt_max = cnt_min<T, C, reverse_comparator_t<Comp>>;
#include <functional>
#include <utility>
#line 2 "src/cnt_min.hpp"
#line 2 "src/reverse_comparator.hpp"
#line 5 "src/reverse_comparator.hpp"
template <typename F> struct reverse_comparator_t {
F f;
template <typename Arg1, typename Arg2> constexpr bool operator() (Arg1&& arg1, Arg2&& arg2) & {
return f(std::forward<Arg2>(arg2), std::forward<Arg1>(arg1));
}
template <typename Arg1, typename Arg2> constexpr bool operator() (Arg1&& arg1, Arg2&& arg2) const& {
return f(std::forward<Arg2>(arg2), std::forward<Arg1>(arg1));
}
template <typename Arg1, typename Arg2> constexpr bool operator() (Arg1&& arg1, Arg2&& arg2) && {
return std::move(f)(std::forward<Arg2>(arg2), std::forward<Arg1>(arg1));
}
template <typename Arg1, typename Arg2> constexpr bool operator() (Arg1&& arg1, Arg2&& arg2) const&& {
return std::move(f)(std::forward<Arg2>(arg2), std::forward<Arg1>(arg1));
}
};
template <typename F> constexpr reverse_comparator_t<std::decay_t<F>> reverse_comparator(F&& f) {
return { std::forward<F>(f) };
}
#line 4 "src/cnt_min.hpp"
template <typename T, typename C = int, typename Comp = std::less<T>> struct cnt_min {
T v;
C cnt;
cnt_min() : v(), cnt(0) {}
explicit cnt_min(T v_) : v(v_), cnt(1) {}
cnt_min(T v_, C cnt_) : v(v_), cnt(cnt_) {}
friend cnt_min operator + (const cnt_min& a, const cnt_min& b) {
if (!b.cnt) return a;
else if (!a.cnt) return b;
else if (Comp().operator()(a.v, b.v)) return a;
else if (Comp().operator()(b.v, a.v)) return b;
else return cnt_min(a.v, a.cnt + b.cnt);
}
cnt_min& operator += (const cnt_min& o) {
return *this = (*this + o);
}
};
template <typename T, typename C = int, typename Comp = std::less<T>> using cnt_max = cnt_min<T, C, reverse_comparator_t<Comp>>;
// clang-format off
// @formatter:off
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpragmas"
#pragma GCC diagnostic ignored "-Wunknown-warning-option"
#pragma GCC diagnostic ignored "-Wmisleading-indentation"
#pragma GCC diagnostic ignored "-Wmultistatement-macros"
#include <bits/stdc++.h>
// src/reverse_comparator.hpp
template<typename F>struct reverse_comparator_t{
F f;
template<typename Arg1,typename Arg2>constexpr bool operator()(Arg1&&arg1,Arg2&&arg2)&{
return f(std::forward<Arg2>(arg2),std::forward<Arg1>(arg1));
}
template<typename Arg1,typename Arg2>constexpr bool operator()(Arg1&&arg1,Arg2&&arg2)const&{
return f(std::forward<Arg2>(arg2),std::forward<Arg1>(arg1));
}
template<typename Arg1,typename Arg2>constexpr bool operator()(Arg1&&arg1,Arg2&&arg2)&&{
return std::move(f)(std::forward<Arg2>(arg2),std::forward<Arg1>(arg1));
}
template<typename Arg1,typename Arg2>constexpr bool operator()(Arg1&&arg1,Arg2&&arg2)const&&{
return std::move(f)(std::forward<Arg2>(arg2),std::forward<Arg1>(arg1));
}
};
template<typename F>constexpr reverse_comparator_t<std::decay_t<F>>reverse_comparator(F&&f){
return{std::forward<F>(f)};
}
// src/cnt_min.hpp
template<typename T,typename C=int,typename Comp=std::less<T>>struct cnt_min{
T v;
C cnt;
cnt_min():v(),cnt(0){}
explicit cnt_min(T v_):v(v_),cnt(1){}
cnt_min(T v_,C cnt_):v(v_),cnt(cnt_){}
friend cnt_min operator+(const cnt_min&a,const cnt_min&b){
if(!b.cnt)return a;
else if(!a.cnt)return b;
else if(Comp().operator()(a.v,b.v))return a;
else if(Comp().operator()(b.v,a.v))return b;
else return cnt_min(a.v,a.cnt+b.cnt);
}
cnt_min&operator+=(const cnt_min&o){
return*this=(*this+o);
}
};
template<typename T,typename C=int,typename Comp=std::less<T>>using cnt_max=cnt_min<T,C,reverse_comparator_t<Comp>>;
#pragma GCC diagnostic pop
// clang-format on
// @formatter:on
#pragma once
#include "reverse_comparator.hpp"
template <typename T, typename C = int, typename Comp = std::less<T>> struct cnt_min {
T v;
C cnt;
cnt_min() : v(), cnt(0) {}
explicit cnt_min(T v_) : v(v_), cnt(1) {}
cnt_min(T v_, C cnt_) : v(v_), cnt(cnt_) {}
friend cnt_min operator + (const cnt_min& a, const cnt_min& b) {
if (!b.cnt) return a;
else if (!a.cnt) return b;
else if (Comp().operator()(a.v, b.v)) return a;
else if (Comp().operator()(b.v, a.v)) return b;
else return cnt_min(a.v, a.cnt + b.cnt);
}
cnt_min& operator += (const cnt_min& o) {
return *this = (*this + o);
}
};
template <typename T, typename C = int, typename Comp = std::less<T>> using cnt_max = cnt_min<T, C, reverse_comparator_t<Comp>>;