제출 #1260535

#제출 시각아이디문제언어결과실행 시간메모리
1260535M_W_13Arranging Tickets (JOI17_arranging_tickets)C++20
0 / 100
2 ms4928 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, n) for (int i = 0; i < (n); i++) #define st first #define nd second #define pb push_back struct tr { int l, r; ll c; }; const int MAXN = 2e5 + 7; int n, m; tr T[MAXN]; ll ile[MAXN]; ll dod[MAXN]; ll dod2[MAXN]; ll policz[MAXN]; ll policz2[MAXN]; vector<pair<int, int>> jakie[MAXN]; bool check(ll f, ll k, int kt) { // cout << "k = " << k << '\n'; // cout << "f = " << f << '\n'; rep(i, m + 1) { ile[i] = T[i].c; } rep(i, n + 2) { jakie[i].clear(); dod2[i] = dod[i]; policz2[i] = 0ll; } priority_queue<pair<int, int>> pq; rep(i, m) { if (T[i].l <= kt && T[i].r >= kt) { jakie[T[i].l].pb({T[i].r, i}); } } ll pol = 0; for (int i = 0; i <= kt; i++) { ll liczba = max(0ll, (policz[i] - pol - k + f)/2); for (auto par: jakie[i]) { pq.push(par); } // cout << "liczba = " << liczba << '\n'; while (liczba > 0) { if (pq.empty()) { return false; } pair<int, int> p = pq.top(); pq.pop(); int l = T[p.nd].l; int r = T[p.nd].r; ll spp = 0; if (ile[p.nd] <= liczba) { liczba -= ile[p.nd]; spp = ile[p.nd]; ile[p.nd] = 0; } else { ile[p.nd] -= liczba; spp = liczba; liczba = 0ll; pq.push(p); } f -= spp; dod2[l] -= spp; dod2[r + 1] += spp; dod2[0] += spp; dod2[l] -= spp; dod2[r + 1] += spp; } } ll s = 0; rep(i, n + 1) { s += dod2[i]; policz2[i] = s; if (s > k) { return false; } } return true; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; rep(i, m) { cin >> T[i].l >> T[i].r >> T[i].c; if (T[i].l > T[i].r) { swap(T[i].l, T[i].r); } dod[T[i].l] += T[i].c; dod[T[i].r] -= T[i].c; T[i].r--; } policz[0] = 0; for (int i = 1; i < n; i++) { policz[i] = policz[i - 1] + dod[i]; } rep(i, n + 1) { dod[i] = 0; } ll x = 0; int kt = 0; rep(i, n) { if (policz[i] >= x) { x = policz[i]; kt = i; } } ll poc = 1; ll kon = x; ll odp = x; // cout << "x = " << x << '\n'; while (poc < kon) { ll sr = (poc + kon)/2; if (check(x - sr, sr, kt) || check(x - sr + 1, sr, kt)) { odp = sr; kon = sr; } else { poc = sr + 1; } } cout << odp << '\n'; 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...