ABC467 F - Email Scheduling Optimization

メール最適化

考え方

まず、クエリを無視して、最初のデータでの最善の値を考える。
これは単純な貪欲法でよく、$B$ の値が大きいものから順にメールを書いて送ればよい。
全てのメールのうち、「そのメールを書き終わる時刻+返信にかかる時間」の最大値が答え。

さて、ではクエリで情報が書き換わる場合はどうか。
まず、上記の話をsegment木に持たせることにする。
segment木のデータは「すべてのメールを書き終えるまでの時間、すべての返信が届くまでの時間」。
単位元は $\{0,0\}$ である。
$B$ の値が大きい順に並べてあれば、データの結合は簡単。

こうすると、$A$ の値の更新は簡単。
$B$ の大きさが変わらないのだから、セグ木の $1$ ヶ所を書き換えるだけでよい。

問題は $B$ の更新。
この場合はsegment木上の順序を変えなければならない。
そこで事前にクエリの内容を全て確認し、セグ木上の移動予定地点に単位元を置いておく。
何番目のクエリでsegment木上の何番目に移動するのかも事前に調べておく。
そうすれば、segment木上の順序変えが実現できる。

以上でこの問題が解け、あとはここから先の実装を頑張るだけ。
計算量は、$O((N+Q)\log (N+Q))$。

入力例1での動作

入力を受け取る。

n: 3
q: 3
a: {4, 6, 7}
b: {4, 6, 7}

1 2 1
2 3 7
2 3 1

タイプ $2$ のクエリで現れる変更後の $B$ も含め、
$B$ の大きい順に使う位置をあらかじめ確保する。

位置 用途 $B$
$0$ $2$ つめのクエリ後の会社 $3$ $7$
$1$ 初期状態の会社 $3$ $7$
$2$ 会社 $2$ $6$
$3$ 会社 $1$ $4$
$4$ $3$ つめのクエリ後の会社 $3$ $1$

初期状態では、位置 $1,2,3$ に会社 $3,2,1$ の情報が入る。
各会社の葉の値は $\{A,A+B\}$ である。

位置0: e
位置1: {7, 14}
位置2: {6, 12}
位置3: {4, 8}
位置4: e

全体を結合すると {17, 21} となる。

$1$ つめのクエリは 1 2 1 である。
会社 $2$ の $A$ が $6$ から $1$ に変わる。

$B$ は $6$ のままなので位置 $2$ から動かず、
その場所の値だけ {1, 7} に変える。

位置0: e
位置1: {7, 14}
位置2: {1, 7}
位置3: {4, 8}
位置4: e

メールを書く順は会社 $3,2,1$ である。
書き終わる時刻は順に $7,8,12$、
返信が届く時刻は $14,14,16$ となる。

よって、$1$ つめの答えは $16$ である。

$2$ つめのクエリは 2 3 7 である。
会社 $3$ の $B$ は元から $7$ だが、
コードではこのクエリ用に確保した位置 $0$ へ移動する。

位置0: {7, 14}
位置1: e
位置2: {1, 7}
位置3: {4, 8}
位置4: e

順序としては変わらないので、答えは再び $16$ である。

$3$ つめのクエリは 2 3 1 である。
会社 $3$ の $B$ が $7$ から $1$ に変わるので、
位置 $0$ から位置 $4$ へ移動する。

位置0: e
位置1: e
位置2: {1, 7}
位置3: {4, 8}
位置4: {7, 8}

今度の順序は会社 $2,1,3$ である。
書き終わる時刻は順に $1,5,12$、
返信が届く時刻は $7,9,13$ となる。

したがって、$3$ つめの答えは $13$ である。

以上より、各クエリの答えは順に $16,16,13$ となる。

注意点

答えは、int 型からはみ出る。
segment木で管理する値と答えには、long long 型を用いること。

別解

特になし。