区間加算
(functional/range_add_and_range_sum.hpp)
Depends on
Verified with
Code
#pragma once
#include"../alga/maybe.hpp"
/**
* @brief 区間加算
*/
template<typename T,typename E>
struct range_add_and_range_sum{
T operator()(const maybe<T>& s,const E& t,int l,int r){
return s.unwrap_or(T())+t*(r-l);
}
};
#line 2 "alga/maybe.hpp"
#include<cassert>
/**
* @brief Maybe
* @see https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8A%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)#Maybe%E3%83%A2%E3%83%8A%E3%83%89
*/
template<typename T>
struct maybe{
bool _is_none;
T val;
maybe():_is_none(true){}
maybe(T val):_is_none(false),val(val){}
T unwrap()const{
assert(!_is_none);
return val;
}
T unwrap_or(T e)const{
return _is_none?e:val;
}
bool is_none()const{return _is_none;}
bool is_some()const{return !_is_none;}
};
template<typename T,typename F>
auto expand(F op){
return [&op](const maybe<T>& s,const maybe<T>& t){
if(s.is_none())return t;
if(t.is_none())return s;
return maybe<T>(op(s.unwrap(),t.unwrap()));
};
}
#line 3 "functional/range_add_and_range_sum.hpp"
/**
* @brief 区間加算
*/
template<typename T,typename E>
struct range_add_and_range_sum{
T operator()(const maybe<T>& s,const E& t,int l,int r){
return s.unwrap_or(T())+t*(r-l);
}
};
Back to top page