제출 #1321529

#제출 시각아이디문제언어결과실행 시간메모리
1321529miniobArranging Tickets (JOI17_arranging_tickets)C++20
100 / 100
1326 ms14912 KiB
#include <bits/stdc++.h> using namespace std; vector<pair<pair<long long, long long>, long long>> wyma; long long roz[200007]; long long ile[200007]; long long sumakon[200007]; long long maxseg = -1, gdziemax, n, m; vector<pair<long long, long long>> przechodzace[200007]; long long cof[200007]; long long gdziemax2; bool spr(long long sr, long long ilezw) { if(ilezw < 0) { return false; } priority_queue<pair<long long, long long>> pq; for(long long i = 0; i < n + 3; i++) { sumakon[i] = 0; } long long cur = 0; long long zostalo = ilezw; for(long long i = 1; i <= gdziemax; i++) { for(auto x : przechodzace[i]) { pq.push(x); } while(ile[i] - cur + zostalo > sr) { if(pq.empty()) { return false; } auto x = pq.top(); pq.pop(); long long potrzeb = ile[i] - cur + zostalo - sr; long long minn = min(x.second, (potrzeb + 1) / 2); cur += minn; zostalo -= minn; sumakon[x.first + 1] += 2 * minn; x.second -= minn; if(x.second > 0) { pq.push(x); } } } sumakon[gdziemax + 1] -= cur; for(long long i = gdziemax + 1; i <= n; i++) { sumakon[i] += sumakon[i - 1]; if(ile[i] + sumakon[i] > sr) { return false; } } return true; } long long policz(long long gdzie) { gdziemax = gdzie; for(long long i = 0; i < n + 3; i++) { przechodzace[i].clear(); } for(auto x : wyma) { if(x.first.first <= gdziemax && gdziemax <= x.first.second) { przechodzace[x.first.first].push_back({x.first.second, x.second}); } } long long l = 0, r = maxseg; while(l < r) { long long sr = (l + r) / 2; if(spr(sr, maxseg - sr) || spr(sr, maxseg - sr + 1)) { r = sr; } else { l = sr + 1; } } return l; } int main() { cin >> n >> m; for(long long i = 0; i < m; i++) { long long a, b, c; cin >> a >> b >> c; if(a > b) { swap(a, b); } wyma.push_back({{a, b - 1}, c}); roz[a] += c; roz[b] -= c; } for(long long i = 1; i <= n; i++) { ile[i] = ile[i - 1] + roz[i]; if(maxseg < ile[i]) { maxseg = ile[i]; gdziemax = i; } if(maxseg == ile[i]) { gdziemax2 = i; } } cout << min(policz(gdziemax), policz(gdziemax2)) << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...