제출 #599526

#제출 시각아이디문제언어결과실행 시간메모리
599526PetyAutobahn (COI21_autobahn)C++14
50 / 100
270 ms24976 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; const int INF = 1e9; const int MOD = 1e9 + 7; int n, k, x; map<int, pair<int, int>>mp; struct intervals { int l, r, cost; bool operator < (const intervals other) { return l < other.l; } } v[300002]; long long s[300002]; int main () { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k >> x; for (int i = 1; i <= n; i++) { int a, b,c; cin >> a >> b >> c; if (a + b - 1 < c) { mp[a + b].second++; mp[c + 1].second--; } mp[a].first++; mp[c + 1].first--; } pair<int, int>sum; int last = 0; int nr = 0; for (auto it2 : mp) { if (sum.first >= k && sum.second) { v[++nr] = {last, it2.first-1, sum.second}; } auto it = it2.second; sum.first += it.first; sum.second += it.second; last = it2.first; } sort(v + 1,v + nr + 1); ll ans = 0; for (int i = 1; i <= nr; i++) { s[i] = s[i - 1] + 1ll * (v[i].r - v[i].l + 1) * v[i].cost; } for (int i = 1; i <= nr; i++) { int idk = i, st = i, dr = nr; while (st <= dr) { int mij = (st + dr) / 2; if (v[mij].l <= v[i].l + x - 1) { idk = mij; st = mij + 1; } else dr = mij - 1; } ll val = s[idk] - s[i - 1]; if (v[i].l + x - 1 <= v[idk].r) val -= (v[idk].r - v[i].l - x + 1) * v[idk].cost; ans = max(ans, val); } for (int i = 1; i <= nr; i++) { int idk = 1, st = 1, dr = i; while (st <= dr) { int mij = (st + dr) / 2; if (v[mij].r >= v[i].l - x + 1) { idk = mij; dr = mij - 1; } else st = mij + 1; } ll val = s[i] - s[idk - 1]; if (v[i].r - x + 1 >= v[idk].l) val -= (v[i].r - x + 1 - v[idk].l) * v[idk].cost; ans = max(ans, val); } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...