Submission #684879

#TimeUsernameProblemLanguageResultExecution timeMemory
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...