2/4 日記

眠すぎる

応用情報、勉強する時間があるのか謎。。。

N - 入れ替えと並び替え (atcoder.jp)

解説ACした。Q回のswapで増加する転倒数は最大でQであり、ソートクエリのときは合計高々Q回のswapを行うことにより計算量が抑えられるというもの。

A[x]>A[x+1] を満たすxをsetで管理すれば、ソートクエリのときに二分探索でa <= x <= bとなるような最小のxを求めることができ、間に合う。

L - スーパーマーケット (atcoder.jp)

実装がやや重かった。

aの値が1か2なので、1列目と2列目をなんらかのデータ構造(データの削除、追加、検索、最大値の取得が高速にできるもの)で保持すればよい。自分はpriority_queue+Tの値を座圧して配列に情報を保持、でやったけど、setでやったほうが実装がやや軽くなるみたい。明日実装しようかな。

O - 宝箱 (atcoder.jp)

最終問題にしてはそこまで難しくなかった。

dp[i]:=i番目まで見たときのY-Xの最大値

というdpはすぐに思いつく。普通に更新するとO(NM)かかる。

ここで、j番目の鍵屋はl j ~ r jまでをcost jで開錠できるという情報を、イベントソートする要領で処理したくなる(イベントの追加と削除ができればdpの更新は簡単)。

イベントを追加するとき、イベントの位置をposとすると、posまでの宝箱をすべて開けたときに得られる合計金額をnowとする。すると、setに(dp[pos-1]-now-cost)を追加すれば、位置iに来た時にsetの最大値をMXとして

now+MXが答えとなることが分かる。

 

ねんねぽよ