問題
ある旅館では、$1$ 号室から $ N $ 号室まで $ N $ 個の部屋があります。
$ i $ 号室は$ A_i $ 人部屋となっています。
この旅館では$ D $日間の工事が行われる予定で、$d$日目は$ L_d $号室から$ R_d $号室までを使うことができません。
$ d=1,2,…,D $のそれぞれの工事日について、稼働できる部屋のうち最も大きい部屋が何人部屋かを求めて下さい。
[制約]
🔹$ 3 \leqq N \leqq 100000 $
🔹$ 1 \leqq D \leqq 100000 $
🔹$ 1 \leqq A_i \leqq 100 $
🔹$ 2 \leqq L_d \leqq R_d \leqq N - 1 $
解き方・ソースコード
まずは、for文を使って泊まれる人数の最大値を計算する方法が思い浮かびますが、計算量が$ O(ND) $ となり実行するのに時間がかかってしまいます。
計算量を減らすために、$L$ 号室から $R$ 号室まで以外の部屋が使えるとき「最も大きい部屋は何人部屋か」を次の式で計算します。
$$ max(1~(L-1)号室の最大人数, (R+1)~N号室の最大人数) $$
1号室から$i$号室までの最大人数$ P_i $、および$i$号室から$N$号室までの最大人数$Q_i$を求めると、$d$日目の答えは$ max(Q_{L_d - 1},Q_{R_d + 1}) $で計算することができます。
次に、$P_i,Q_i$を求めるために、累積和と同じような方法を使うことができます。
$P_i$については先頭要素$A_i$から累積的に最大値を計算し、$Q_i$については最終要素$A_N$から累積的に最大値を計算しておくと、計算量$O(N)$でそれぞれの値を求められます。
[Google Colaboratory]
1 | #--------- 入力例 1 --------- |
[実行結果(入力例1)]
工事1日目に使える最も大きい部屋数は3人部屋 工事2日目に使える最も大きい部屋数は5人部屋
工事日ごとに使える部屋のうち、最も大きい部屋が何人部屋かを求めることができました。