けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 060 C - Sentou (5Q, 茶色, 300 点)

愚直シミュレーションをする問題。ただ、ある程度は計算量を知らないとドツボにハマる可能性がある。

問題概要

あるシャワーは、スイッチを押すとその後  T 秒間お湯が出る (延長するわけではない)。

時刻  t_{1}, t_{2}, \dots, t_{N} (単調増加) にスイッチを押したとするとき、お湯が出ている時間は合計何秒か?

制約

  •  1 \le N \le 2 \times 10^{5}

考えたこと

 i について、時刻  t_{i} から時刻  \min(t_{i} + T, t_{i+1}) までお湯が出たものとみなせばよい。

つまり、時刻  t_{i} にスイッチを押した分の効果は、もし時刻  t_{i+1} までお湯が出ていた場合、時刻  t_{i+1} にスイッチを押すことによって完全に上書きされると考えるのだ。

なお、 t_{N} にスイッチを押した分については  T 秒間流れ続ける。

この解法を素直に実装すると、 O(N) の計算量となる。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long N, T;
    cin >> N >> T;
    vector<long long> t(N);
    for (int i = 0; i < N; i++) cin >> t[i];

    long long res = 0;
    for (int i = 0; i+1 < N; i++) res += min(T, t[i+1] - t[i]);
    res += T;
    cout << res << endl;
}