調べる区間の幅をだんだん大きくしていくという考え方。隣り合う1項の最小値(つまりその項自身)の合計値。数がそれぞれ1回ずつ出てきているので、等差数列の和と考えて計算する。項の最小値を計算してansに足していく。}の最小値を順番に求めている。小さな値との距離がわかれば求めることができる。3}という数列の6が最小値となる区間を考える。3}となり、6より小さな値(赤色の数字)が存在しないような区間(部分数列)は{8,6}{8,6,7}{6}{6,7}の4つとなる。ここで、6が最小値となる区間の左端は、はじめの数列の「6より左にあって6より小さな一番6に近い値(=1)」よりも右で、6よりも右ではない数字になっていることがわかるので、6が最小値となる区間の左端は8,6のどちらかであり、この8,6という左端の候補の数(=2)は「6より左にあって6より小さな一番6に近い値(=1)」と6との距離である。同様に、6が最小値となる区間の右端は6,7のどちらかであり、右端の候補の数(=2)は「6より右にあって一番6に近い6より小さな値(=3)」と6との距離である。6が最小値となる区間の数は(左端の候補の数)*(右端の候補の数)より2*2=4個と求めることができる。近い数との距離が必要になる。添字iに一番近い数をlower_boundを使って高速に調べればよい。そのまま入れることができるので、効率よく求めることができる。それぞれに対して行っても。a[order[N-1]]=Nとなるように格納する。はじめにsetに入れた-1とNは番兵の役割をする。小さな値が存在しないときはNが返される。あとは最小値が1となる区間、最小値が2となる区間、...と順番に区間の数を計算してtmpに入れて、ansに足していく。その他の解法pekempeyさんがUnion-Findを使った解法を解説しています。pekempeyのブログまた、standingsで他の人のソースコードを見てみると、stackを使った解法などもあるようです(私にはよくわからなかったのですが......)。コイン数学ができないので。期待値問題は苦手です。はてなブログをはじめよう!wk1080idさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。