널빤지로 덮은 부분은 다시 덮을 필요가 없다고 생각하면 된다. 그렇다면 끝부분까지 완벽하게 덮은 뒤 그 부분을 시작점으로 하면 되는 것이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, L, ret = 0, start = 0;
cin >> N >> L;
vector<pair<int, int>> v;
while (N--)
{
int n1, n2;
cin >> n1 >> n2;
v.push_back({n1, n2});
}
sort(v.begin(), v.end());
for (auto p : v)
{
start = max(start, p.first);
int multi = (p.second - start + L - 1) / L;
ret += multi;
start += multi * L;
}
cout << ret;
return 0;
}
나머지 연산으로 딱 떨어지는지 확인을 자주 했었는데 나눌 값으로 더하고 -1하고 나누면 굳이 나머지 연산을 안 해도 되어서 좋은 것 같다.