ymduu+2

初心を忘れないのでツンデレとPSPが今でも好き、技術メモとか制作物とかそういうの

AGC005 B Minimum Sum

Minimum Sum

Submission #3330734 - AtCoder Grand Contest 005 | AtCoder

問題概要

素数Nの順列が与えられる。すべての区間の最小値の和を求めよ。

取った方針

N=200000なので、すべての区間を列挙すると間に合わない。a_iが最小値になる区間の個数を数えてそれにa_iをかけたものの和を求めればよい気がするが、a_iが最小値になる区間の個数を数えられず終了

正しい方針(解説の方針)

a_iが小さい順に区間の個数を数えることを考える。
それまでに見た数(1,2,...a_i-1)の位置を記録しておくと、a_iが最小値になりうる区間の左端はインデックスがi以下で最大のもの、右端はi以上でインデックスが最小のものとなる。
これは、1,2...a_iまでのインデックスをsetに入れておき、a_iの一つ前/一つ後を取得することで得ることができる。
なぜなら、上記のようにすると、a_i以下の数のインデックスのみsetに入ることになるからである。

得られた知見

  • どう考えても全列挙は不可能(区間)->全列挙可能なもの(区間の個数)に着目
  • 条件A(a_iより小さい)を満たす中でB(インデックスがiより大きい/小さい)なもの->条件Aをみたす集合の中で考えると見通しがよくなることがある
    • 例 : a_iよりも小さい数のうちインデックスがi以下で最大のもの はa_i以下の数のインデックスのsortedなsetの中ではiの隣に来る

解くのに必要な要素

  • 厳しい制約->厳しくない部分に着目
  • 小さい方/大きい方から確定させていく
  • 条件を満たすものの集合内で考える

周辺調査によって得られた知見

なし