ABC471 D - Chargers
充電器
考え方
バッテリーが様々なタイミングで差し込まれる。
これを愚直にいちいち処理すると大変。
ところが、時刻 $t$ に残量 $w$ で差し込まれたというのを次のように言い換えれば簡単になる。
仮に、時刻 $0$ から残量 $w-t$ のバッテリーが挿されていたとしよう。
このバッテリーには、時刻 $t$ に残量 $w$ になっているはず。
つまり、時刻 $0$ から残量 $w-t$ のバッテリーがあったことに今気づいたということにしてもよい。
すると、「時刻 $0$ 時点で残量いくつだったか」を priority_queue で管理するだけの話になる。
クエリ $2$ が来た時には、初期残量に $t$ を加えてから $V$ 以上なら $V$ に丸める処理をすればよい。
計算量は $O(Q\log Q)$ である。
入力例1での動作
入力を受け取る。
q: 7
v: 100
1 15 60
1 25 80
2 30
1 45 0
2 60
2 70
2 80
バッテリーを追加するときは、時刻 $0$ 時点での残量とみなした $w-t$ を管理する。
値が大きいものから取り出せるようにしておく。
各クエリは次のように処理される。
| クエリ | 処理 | 管理している値 | このクエリの答え |
|---|---|---|---|
1 15 60 |
$60-15=45$ を追加 | $45$ | |
1 25 80 |
$80-25=55$ を追加 | $55,45$ | |
2 30 |
$\min(100,55+30)=85$ のバッテリーを排出 | $45$ | $85$ |
1 45 0 |
$0-45=-45$ を追加 | $45,-45$ | |
2 60 |
$\min(100,45+60)=100$ のバッテリーを排出 | $-45$ | $100$ |
2 70 |
$\min(100,-45+70)=25$ のバッテリーを排出 | 空 | $25$ |
2 80 |
バッテリーがない | 空 | $-1$ |
タイプ $2$ の各クエリの答えは、順に $85,100,25,-1$ である。
注意点
特になし。
別解
特になし。