CODE FESTIVAL 2018 qual A D - 通勤
解法
後ろの方から見ていくと見通しが良くなるのかな、と思いきやそうでもありませんでした。
番目のガソリンスタンドで燃料を補給する場合の、~番目のガソリンスタンドの建て替え方
とします。
仮に今燃料が満タンの状態で番目のガソリンスタンドにいる場合、となるi番目のガソリンスタンドで燃料を補給するには、
を満たしている必要があります。
また、上の条件を満たすガソリンスタンドが複数存在した場合は、その一番手前のガソリンスタンドに到着した時点で、補給することになります。
逆に、を満たす区間のガソリンスタンドは、書店に変えても変えなくても結果が変わらないので、自由に決めることができます。
ということで、
の区間内のガソリンスタンドの決め方が、の区間内で燃料を補給する場合のガソリンスタンドの建て替え方にかかわっていることがわかります。
これを式にすると、
番目のガソリンスタンドから、正の方向で距離以内に存在するガソリンスタンドの個数をとし、
番目のガソリンスタンドから、負の方向で距離がより大きく以下の位置にあるガソリンスタンドの番号をとすると、
となります。
の候補が複数存在する場合はすべて足し合わせます。
の全候補はで候補の左端、右端をそれぞれ調べることで求めることができます。
も、上と同様の操作を行うことで、で求めることができます。
あとは、
を、~までの累積和として記録しておくことで、について、O(1)で計算することができるようになるので、このdpが時間内に解けるようになります。
最後に、答えを求めるのですが、これは上と似たような操作を行うことで答えを求めることができます。
番目のガソリンスタンドとDの距離がより大きく以下であれば、上とまったく同じ操作を行えば答えが求まります。
以下であれば、その距離内のガソリンスタンドの個数だけ、をにかけてあげてから足してあげることで、答えが求まります。
この計算により、最終的な答えが求まります。