競技プログラミング用 知識集積所
ABC439F - Beautiful Kadomatsu
最終更新:
sport_programming
-
view
問題
必要知識
B以下レベルの内容は省略
考え方
2つの条件を満たすiの位置は、必ず上下が交互に出現する。
つまり、条件を満たすのは上が先に出現し、最後も上が出現するとき。
さらに言い換えると、最初の2個が昇順で、最後の2個が降順になっているとき。
つまり、条件を満たすのは上が先に出現し、最後も上が出現するとき。
さらに言い換えると、最初の2個が昇順で、最後の2個が降順になっているとき。
これは、取り出した数列の右から2番目がどこなのかで分類してカウントすることができる。
ある場所iについて、
ある場所iについて、
- そこより左にA[i]より小さい値がL個ある
- そこより右にA[i]より小さい値がR個ある
- そこより左で、長さが2以上かつ最初の2つが昇順である部分列を作る方法がS通りある
だった場合、右から2番目がi番目である部分列で条件を満たすものは、
- 長さが3のものはL*R個
- 長さが4以上のものはS*R個
ある。
したがって、各iについてLとRとSを高速で求められれば、あとはその総和でよい。
したがって、各iについてLとRとSを高速で求められれば、あとはその総和でよい。
- i番目を採用しないものはS[i-1]通り
- i番目を採用する長さ3以上のものはS[i-1]通り
- i番目を採用する長さ2のものはL[i-1]通り
であるから。
ということで、あとは先述の計算をすればよい。
ということで、あとは先述の計算をすればよい。