ã»ã°ã¡ã³ãæ¨ã¨ã¯
ã»ã°ã¡ã³ãæ¨ï¼ä»¥ä¸ãã»ã°æ¨ï¼ã¨ã¯ãäºåæ¨ãä½ããåãã¼ãï¼é ç¹ï¼ã«åºéã®æ
å ±ãä¸ãããã¨ã§ãåºéã¯ã¨ãªã«
ã§çãããã¨ãã§ãããã¼ã¿æ§é ã§ããã»ã°æ¨ã«ã¯ã¢ãã¤ããä¹ãã¾ããã¢ãã¤ãã¨ã¯ã以ä¸ã®æ§è³ªãæºãããéåSã¨äºé
æ¼ç®Fã®çµãã§ãã
1. Fã«ã¤ãã¦éãã¦ãã
Sã®å
ã¨å
ã§Fãããã¨ãããã®è¿ãå¤ãSã®å
ã§ããã
2. çµååãæºãã
ä¾ãã°ãSã®å
s1ãs2ãs3ã«ã¤ãã¦ãF(F(s1, s2), s3) == F(s1, F(s2, s3))ãæãç«ã¤ã
ã¤ã¾ããé çªã¯ãã®ã¾ã¾ã«ãã¦ã©ãããæ¼ç®ãè¡ã£ã¦ãããã
3. åä½å
ããã
ã¨ããSã®å
eãåå¨ãã¦ãä»»æã®Sã®å
sã«å¯¾ãã¦F(s, e)==sãæãç«ã¤ã
ã¤ã¾ããä½åè¨ç®ãã¦ãçãã«å½±é¿ãä¸ããªããããªè¦ç´ ãããã
ä¾ãã°ã
足ãç®ï¼0ã足ã
æãç®ï¼1ãæãã
æå°å
¬åæ°ï¼1ã¨ã®æå°å
¬åæ°ãåã
æ大å
¬ç´æ°ï¼0ã¨ã®æ大å
¬ç´æ°ãåã
æå°å¤ã®æ´æ°ï¼åãå¾ãä¸çªå¤§ããå¤ããã大ããå¤ã§æ´æ°ãã
æ大å¤ã®æ´æ°ï¼åãå¾ãä¸çªå°ããå¤ãããå°ããå¤ã§æ´æ°ãã
ãªã©ã§ãã
ã¡ãªã¿ã«ãã¢ãã¤ãã®éåSã«ã¤ãã¦ãå
¨é¨ã®å
sã«éå
s'ãããï¼F(s, s') == eãeã¯åä½å
ï¼ã¨ãã群ã¨è¨ãã¾ãã
ã»ã°æ¨ã¯ããã¼ããæã¤è¦ç´ ã®åæ°ã2ã®ã¹ãä¹ã«ãªã£ã¦ãã¾ããåºéã¯ã¨ãªã欲ããã£ããã2ã®ã¹ãä¹åãã¨ã«ã¾ã¨ã¾ã£ããã®ãäºé
æ¼ç®Fã§ã¾ã¨ããã ããªã®ã§ã
ã§ãããéæãããã¨ãã§ãã¾ãã
æ®éã®ã»ã°æ¨ã§ã¯ä¸ç¹æ´æ°ã»åºéå ç®ãªã©ãåå¾ã¯ã¨ãªã®ã¿åºéããå¾ããã¨ãã§ãã¾ãããããã¯imosæ³ã®ããã«ãã¦ãåºéå ç®ã»ä¸ç¹åå¾ãªã©ãã§ãã¾ãããå ç®ã¨åå¾ã®ä¸¡æ¹ãåºéã«å¯¾ãã¦è¡ããã¨ã¯ã§ãã¾ãããããã«å¯¾ãã¦ãé
延ã»ã°ã¡ã³ãæ¨ã§ã¯ãããå¯è½ã§ãã
é
延ã»ã°æ¨ã使ã£ã¦ã¿ã
è¨èªã¯C++ãã©ã¤ãã©ãªã¯AtCoder Libraryã使ãã¾ããALPCï¼AtCoder Library Practice Contestï¼ã®Kåé¡ã解ãã¾ãã
åé¡ï¼K - Range Affine Range Sum
ããã¯ãåºéã®åè¦ç´ ã«ã¢ãã£ã³å¤æï¼aåãã¦b足ãï¼ããã¦ãåºéã®åãåå¾ããã¨ããã¯ã¨ãªã«çããåé¡ã§ããé
延ã»ã°æ¨ã§ã¯ãäºé
æ¼ç®ãåä½å
ã¯ããã¨ãã¦ãmappingã¨compositionã®è¨è¨ãéè¦ã«ãªã£ã¦ãã¾ããã¾ããåä½å
ã®ååãã¼ã¸ã§ã³ã§ãããæçååãè¦æ±ããã¾ããããã¯ãä½åé©ç¨ãã¦ãè¦ç´ ãå¤ãããªãååã¨ãããã¨ã§ãåä½å
ã¨ä¼¼ã¦ãã¾ãã
ã§ã¯ãå®éã®ã³ã¼ããè¦ã¦ãã ããã
#include <atcoder/lazysegtree>
#include <atcoder/modint>
using mint = atcoder::modint998244353;
struct S {
mint sum;
ll sz;
};
struct F {
mint b;
mint c;
};
vector<S> a(N);
rep(i, 0, N){
ll tmp;
cin >> tmp;
a[i] = {tmp, 1};
};
auto op = [](S s1, S s2){
return S{s1.sum+s2.sum, s1.sz+s2.sz};
};
auto ids = []{
return S{0, 1};
};
auto mapping = [](F f, S s){
return S{f.b*s.sum+f.c*s.sz, s.sz};
};
auto composition = [](F f1, F f2){
return F{f1.b*f2.b, f1.b*f2.c+f1.c};
};
auto idf = []{
return F{1, 0};
};
atcoder::lazy_segtree<S, op, ids, F, mapping, composition, idf> seg(a);
ä¸é¨ã ãåãæãã¾ããããããä½ããã¨ãã§ããã°ããã¨ã¯seg.apply(l, r, x)ã§[l, r)ã«xãä½ç¨ãããseg.prod(l, r)ã§åºéã¯ã¨ãªãåå¾ãã¦çµããã§ãããã®æ§ç¯ãé£ããã£ãããã¦ãç¹ã«mappingã¨compositionãè¦ã¦ãã ãããã¾ããå
Sã¨ä½ç¨ç´ Fã¯ã©ã®ããã«ãªã£ã¦ãããã«ã注ç®ãã¦ãã ãããããã§ãSã¯Dataã§ãããFã¯Lazyã§ãã
ã¾ããé
延ã»ã°æ¨ã«ã¯8åã®è¦ç´ ãå¿
è¦ã§ãã
1. å
ã®åS
2. äºé
æ¼ç®op
3. åä½å
idsï¼identity Sï¼
4. ä½ç¨ç´ ã®åF
5. ä½ç¨ç´ ã¨å
ãããå
ã¸ã®ååmapping
6. åæååcomposition
7. æçååidfï¼identity Fï¼
8. é
延ã»ã°æ¨ã®ãµã¤ãºï¼åä½å
ã§åæåãããï¼
ï¼ã¾ãã¯ãåSã®åæåé
åï¼
1. å
ã®åS
åºéå ç®ãããã¨ãããµã¤ãºlãåããã¨ãããããã¹ã¦ã«xã足ãã®ã§ãå
¨ä½ã®åè¨ã«ã¯låã®x足ãã°ãããã¨ãåããã¾ãããããããããã®ã§ãSã¯æ§é ä½ã¨ãã¦ãåºéåã¨åºéã®ãµã¤ãºãæããã¦ããã¾ãã
2. äºé
æ¼ç®op
äºã¤ã®åSã®å
s1ã¨s2ãä¸ããããã¨ããããããåå¾ã¯ã¨ãªã¨ãã¦ãã¼ã¸ããéã®è¨ç®ã§ããä»ãåºéåã¨åºéã®ãµã¤ãºãæã£ã¦ããã®ã§ããããã足ãã°ããã§ãã
3. åä½å
ids
å
ãªã®ã§ãåã¯Sã§ããåºéåã¯0ã足ãã¦ãå¤ããããå
ã¨ãã¦ãµã¤ãºã¯1ã§ããã®ã§ãS{0, 1}ãåä½å
ã¨ãªãã¾ãã
4. ä½ç¨ç´ ã®åF
båãã¦c足ãã®ã§ãæ
å ±ã¨ãã¦ã¯bã¨cã欲ããã§ãããããæ§é ä½ã§æã¡ã¾ãã
5. ä½ç¨ç´ ã¨å
ãããå
ã¸ã®ååmapping
é£ãããã¤ã³ã1ã§ããSã«Fãé©ç¨ãããã¨ãèãã¾ããå
Sã«F.båãã¦F.cã足ãã¾ããããã§ãSã¯ãã§ã«ãã®åºéå
¨ä½ã足ããã¦ããã®ã§ããã®S.sumãåã«F.båããã°ãå
¨è¦ç´ ã«F.båãããã¨ã«ãªãã¾ããã¾ããS.szã§åºéã®ãµã¤ãºãåããã®ã§ãS.szåãã¦F.c足ãã°ãå
¨è¦ç´ ã®åF.c足ãããã¨ã«ãªãããããS.sumã«è¶³ãã°ããã§ãããµã¤ãºã¯Lazyãé©ç¨ãã¦ãå¤ãããªãã®ã§ããã®ã¾ã¾S.szã渡ãã¾ãã
6. åæååcomposition
é£ãããã¤ã³ã2ã§ããF f1ã¨F f2ã«ã¤ãã¦ããããã®åæååfãèãã¾ããå
sã«å¯¾ãã¦ãf = f1(f2(s))ã¨ãã¦åæãã¾ãããããå±éããã¨ãç»åã®ããã«ãªããæçµçã«f.b = f1.bÃf2.båãã¦ãf.c = f1.bÃf2.c+f1.cã足ããã¨ã¨åãã¨ãªããããããfã¨ãã¦è¿ãã¾ãã

7. æçååidf
ä½åé©ç¨ãã¦ãå
ãå¤ãããªãä½ç¨ç´ Fãªã®ã§ãb = 1ãc = 0ã¨ããã¨ã1åãã¦0足ãã¨ãªãããã¾ãããã¾ãã
8. é
延ã»ã°æ¨ã®ãµã¤ãºã¾ãã¯ãåæåé
å
åé¡æã§ä¸ãããã¦ããéãã§ãã
ããã§é
延ã»ã°æ¨ãå®æããããã¨ãã§ãã¾ããããã¨ã¯ã¯ã¨ãªã«ç´ ç´ã«çãã¦ããã°ããã§ãã
vector<S> ans;
rep(_, 0, Q){
ll t;
cin >> t;
if (t==0){
ll l, r, b, c;
cin >> l >> r >> b >> c;
seg.apply(l, r, F{b, c});
} else {
ll l, r;
cin >> l >> r;
ans.emplace_back(seg.prod(l, r));
}
}
æåºï¼Submission #56201586 - AtCoder Library Practice Contest
ããã§ãã®åé¡ã¯çµããã§ããããããä½ãã«æ°ã¥ãã人ã¯ãã¾ãããï¼ï¼ï¼ï¼ãªãã¨ãåºéæ´æ°ã¨ããæ¼ç®ã«ã¯æçååãåå¨ãã¾ãããä½ãã®å¤ã«æ´æ°ããã¨ãå
ã®å¤ãå¤ãã£ã¦ãã¾ããããå½±é¿ãä¸ããªããããªåºéæ´æ°ã¨ãããã®ã¯åå¨ãã¾ããããã®ãããªã¨ããæçååidfã¯ã©ã®ããã«æ±ãã°ããã§ãããããã¾ããmappingãcompositionã¯ããã®æçååã¨ã©ã®ããã«é¢ããã§ããããã
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
çãï¼æ¬ä¼¼çãªæçååã¨ãã¦ãåãå¾ãªãå¤ã«ãã¦ãããmappingã¨compositionã¯ãæçååã¨ä¸è´ãã¦ãããã©ããã§å ´ååããããã
以ä¸ã¯Range Update Range Minimumã®ã³ã¼ãã®ä¾ã§ãã
auto op = [](ll a, ll b){
return min(a, b);
};
auto ids = []{
return inf;
};
auto mapping = [](ll f, ll s){
if (f==-1){
return s;
} else {
return f;
}
};
auto composition = [](ll f1, ll f2){
if (f1==-1){
return f2;
} else {
return f1;
}
};
auto idf = []{
return -1LL;
};
Range Minimumãªã®ã§ãopã¯æå°å¤ãidsã¯infã¨ãªã£ã¦ãã¾ããåé¡ã¯ä½ç¨ç´ ã®æ¹ã§ãã¾ããåãå¾ãå¤ã®ç¯å²ã[1, 10^9]ãªã©ã¨ä»®å®ãã¦ãæçååã¯-1ã«ãã¦ããã¾ããããã¨ãmappingãcompositionã«ç»å ´ããä½ç¨ç´ fã¯ã-1ã®ã¨ããä½ãããªãã¨ãã¦æ±ããã¨ãã§ãã¾ãããããæçååã¨ãã¾ããããã¨ããã¨ã¯æ®éã®é
延ã»ã°æ¨ã¨åãããã«ä½¿ããã¨ãã§ãã¾ãã
compositionã¯composition(ll f1, ll f2)ã®ã¨ããf2âf1ã®é ã«é©ç¨ããã®ã§ãf1ã-1ãã©ããã§å ´ååããããã¨ã«æ³¨æãã¦ãã ããã