AtCoder LibraryのLazy Segtreeのチートシート
AtCoder LibraryのLazy Segtreeの使い方 - ARMERIA
こちらの記事でAtCoder LibraryのLazy Segtreeの使い方を説明しましたが、コンテスト中に読んでられっか!みたいな時のためにコピペで使えるチートシートをまとめます。整数列に対する、以下の組み合わせ6種類です。
オーバーフローで死なないように整数列の要素を long long
で扱っています。また INF
および ID
として を使います。
区間加算・区間最小値取得
AOJ(RMQ and RAQ)提出:Aizu Online Judge
using S = long long; using F = long long; const S INF = 8e18; S op(S a, S b){ return std::min(a, b); } S e(){ return INF; } S mapping(F f, S x){ return f+x; } F composition(F f, F g){ return f+g; } F id(){ return 0; } int main(){ int N; std::vector<S> v(N); atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v); }
区間加算・区間最大値取得
using S = long long; using F = long long; const S INF = 8e18; S op(S a, S b){ return std::max(a, b); } S e(){ return -INF; } S mapping(F f, S x){ return f+x; } F composition(F f, F g){ return f+g; } F id(){ return 0; } int main(){ int N; std::vector<S> v(N); atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v); }
区間加算・区間和取得
区間幅が必要なので値を構造体で持ちます。seg.prod(l, r).value
で値を取り出してください。
AOJ(RSQ and RAQ)提出:Aizu Online Judge
struct S{ long long value; int size; }; using F = long long; S op(S a, S b){ return {a.value+b.value, a.size+b.size}; } S e(){ return {0, 0}; } S mapping(F f, S x){ return {x.value + f*x.size, x.size}; } F composition(F f, F g){ return f+g; } F id(){ return 0; } int main(){ int N; std::vector<S> v(N, {0, 1}); atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v); }
区間変更・区間最小値取得
AOJ(RMQ and RUQ)提出:Aizu Online Judge
using S = long long; using F = long long; const S INF = 8e18; const F ID = 8e18; S op(S a, S b){ return std::min(a, b); } S e(){ return INF; } S mapping(F f, S x){ return (f == ID ? x : f); } F composition(F f, F g){ return (f == ID ? g : f); } F id(){ return ID; } int main(){ int N; std::vector<S> v(N); atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v); }
区間変更・区間最大値取得
using S = long long; using F = long long; const S INF = 8e18; const F ID = 8e18; S op(S a, S b){ return std::max(a, b); } S e(){ return -INF; } S mapping(F f, S x){ return (f == ID ? x : f); } F composition(F f, F g){ return (f == ID ? g : f); } F id(){ return ID; } int main(){ int N; std::vector<S> v(N); atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v); }
区間変更・区間和取得
区間幅が必要なので値を構造体で持ちます。seg.prod(l, r).value
で値を取り出してください。
AOJ(RSQ and RUQ)提出:Aizu Online Judge
struct S{ long long value; int size; }; using F = long long; const F ID = 8e18; S op(S a, S b){ return {a.value+b.value, a.size+b.size}; } S e(){ return {0, 0}; } S mapping(F f, S x){ if(f != ID) x.value = f*x.size; return x; } F composition(F f, F g){ return (f == ID ? g : f); } F id(){ return ID; } int main(){ int N; std::vector<S> v(N, {0, 1}); atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v); }