제출 #684879

#제출 시각아이디문제언어결과실행 시간메모리
684879sidonAutobahn (COI21_autobahn)C++17
100 / 100
236 ms29824 KiB
#include <bits/stdc++.h>
using namespace std;
#define int int64_t

const int INF = 2e9+1;

signed main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int N, K, X; cin >> N >> K >> X;

	vector<array<int, 2>> a[2];
	vector<int> c;
	for(int i = 0; i < N; ++i) {
		int l, t, r; cin >> l >> t >> r;
		a[0].push_back({l, r});

		if(r - l + 1 > t)
			a[1].push_back({l + t, r});
	}

	for(auto &i : a) for(auto &j : i) for(int &k : j)
		for(int add : {-1, 0, 1}) c.push_back(k + add);

	sort(begin(c), end(c));

	c.erase(unique(begin(c), end(c)), end(c));
	int m = size(c);

	for(auto &i : a) for(auto &j : i) for(int &k : j)
		k = lower_bound(begin(c), end(c), k) - begin(c);

	int ans {};

	for(int __ : {0, 1}) {
		if(__) {

			for(int i : {0, 1}) for(auto &[l, r] : a[i]) {
				l = m - 1 - l, r = m - 1 - r;
				swap(l, r);
			}

			for(int &i : c) i = INF - i;
			reverse(begin(c), end(c));
		}

		int __sz = 2, add[__sz][m] {}, cur {};

		for(int k : {0, 1}) for(auto [i, j] : a[k]) {
			++add[k][i];
			--add[k][j+1];
		}

		for(int i = 1; i < m; ++i)
			for(int j : {0, 1})
				add[j][i] += add[j][i-1];

		for(int l = 0, r = 0; l < m; ++l) {

			while((r + 1) < m && (c[r + 1] - c[l]) < X) {
				if(add[0][r] >= K)
					cur += add[1][r] * (c[r + 1] - c[r]);
				++r;
			}

			int oh = cur;
			if(add[0][r] >= K) oh += add[1][r] * (X - (c[r] - c[l]));

			ans = max(ans, oh);

			if(l + 1 < m && add[0][l] >= K)
				cur -= add[1][l] * (c[l + 1] - c[l]);
		}
	}

	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...