cp-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ttamx/cp-library

:warning: group/monoid-action/max-count-add.hpp

Depends on

Code

#pragma once
#include "group/monoid/add.hpp"
#include "group/monoid/max-count.hpp"

/**
 * Author: Teetat T.
 * Date: 2024-04-14
 * Description: Add to Max & Count Action class.
 */

template<class T>
struct MaxCountAddAction{
    using InfoMonoid = MaxCountMonoid<T>;
    using TagMonoid = AddMonoid<T>;
    using Info = typename InfoMonoid::value_type;
    using Tag = typename TagMonoid::value_type;
    static constexpr Info op(const Info &a,const Tag &b){
        if(a.first==InfoMonoid::unit().first)return a;
        return Info(a.first+b,a.second);
    }
};
#line 2 "group/monoid/add.hpp"

/**
 * Author: Teetat T.
 * Date: 2024-04-14
 * Description: Add Monoid class.
 */

template<class T>
struct AddMonoid{
    using value_type = T;
    static constexpr T op(const T &x,const T &y){return x+y;}
    static constexpr T inverse(const T &x){return -x;}
    static constexpr T unit(){return T(0);}
};

#line 2 "group/monoid/max-count.hpp"

/**
 * Author: Teetat T.
 * Date: 2024-04-14
 * Description: Max & Count Monoid class.
 */

template<class T>
struct MaxCountMonoid{
    using P = pair<T,int>;
    using value_type = P;
    static constexpr P op(const P &x,const P &y){
        if(x.first>y.first)return x;
        if(y.first>x.first)return y;
        return P(x.first,x.second+y.second);
    }
    static constexpr P unit(){return P(numeric_limits<T>::min(),0);}
    static constexpr P make(const T &x){return P(x,1);}
};

#line 4 "group/monoid-action/max-count-add.hpp"

/**
 * Author: Teetat T.
 * Date: 2024-04-14
 * Description: Add to Max & Count Action class.
 */

template<class T>
struct MaxCountAddAction{
    using InfoMonoid = MaxCountMonoid<T>;
    using TagMonoid = AddMonoid<T>;
    using Info = typename InfoMonoid::value_type;
    using Tag = typename TagMonoid::value_type;
    static constexpr Info op(const Info &a,const Tag &b){
        if(a.first==InfoMonoid::unit().first)return a;
        return Info(a.first+b,a.second);
    }
};
Back to top page