Strorkisのブログ

信憑性については悪しからず

yukicoder contest 240 F (No.1008 Bench Craftsman)

問題

No.1008 Bench Craftsman - yukicoder

解法

基本は解説の通りであるが、自分なりの説明を行う。

まず、ベンチの耐久度 cを固定すると、人 j i番目の区画に与える負荷は、 max(0, w_{j} - abs(i-x_{j}) \cdot c)である。
この負荷は正の場合、人毎に等差数列になるため、imos法を用いることで、 i番目の区画に与える負荷の合計を、 O(N+M)で求めることができる。

imos法の考え方としては、初項の場合は累積和を1回、公差の場合は累積和を2回行うことで、等差数列を作ることができる。
ただし、今回の場合は x_{j}で傾きが反転するため、公差の場合においては左右それぞれの場合を考える必要がある。

右側の場合は比較的単純であるが、左側の場合は少し工夫が必要であり、1回目の累積和を行う際に、区間を1つ右にずらしておく必要がある。
そうすることで、実装の手間を減らすことができる。

あとは、固定していたベンチの耐久度 cを二分探索すれば良い。
ただし、 cが0の場合は、負荷が正である個数を Nにするか、処理を分ける必要がある。

全体の計算量は、 O((N+M)log(max(w_{j})))となる。

コード

#440982 No.1008 Bench Craftsman - yukicoder

感想

わかってみるとそれほど難しくはないが、わかるまでが大変だった。
ただ、苦戦しただけあって、imos法の考え方を少しは理解できたように思う。
(自分なりの説明ができているかどうか微妙なので、問題があれば消します)