Submission #1264115

#TimeUsernameProblemLanguageResultExecution timeMemory
1264115kunzaZa183Sails (IOI07_sails)C++20
100 / 100
199 ms5900 KiB
#include <bits/stdc++.h> using namespace std; vector<int> mini, maxi, lz; int ss; void lzy(int curin, int curl, int curr) { if (curl == curr) { maxi[curin] += lz[curin]; mini[curin] += lz[curin]; lz[curin] = 0; return; } lz[curin * 2 + 1] += lz[curin]; lz[curin * 2 + 2] += lz[curin]; maxi[curin] += lz[curin]; mini[curin] += lz[curin]; lz[curin] = 0; } int ql, qr; void upd(int curin, int curl, int curr) { lzy(curin, curl, curr); if (ql > curr || qr < curl) return; if (ql <= curl && curr <= qr) { lz[curin] = 1; return lzy(curin, curl, curr); } upd(curin * 2 + 1, curl, (curl + curr) / 2); upd(curin * 2 + 2, (curl + curr) / 2 + 1, curr); maxi[curin] = max(maxi[curin * 2 + 1], maxi[curin * 2 + 2]); mini[curin] = min(mini[curin * 2 + 1], mini[curin * 2 + 2]); } int qval; int lmost(int curin, int curl, int curr) { lzy(curin, curl, curr); if (curl == curr) return curl; lzy(curin * 2 + 1, curl, (curl + curr) / 2); lzy(curin * 2 + 2, (curl + curr) / 2 + 1, curr); if (mini[curin * 2 + 1] <= qval && qval <= maxi[curin * 2 + 1]) { return lmost(curin * 2 + 1, curl, (curl + curr) / 2); } assert(mini[curin * 2 + 2] <= qval && qval <= maxi[curin * 2 + 2]); return lmost(curin * 2 + 2, (curl + curr) / 2 + 1, curr); } int rmost(int curin, int curl, int curr) { lzy(curin, curl, curr); if (curl == curr) return curl; lzy(curin * 2 + 1, curl, (curl + curr) / 2); lzy(curin * 2 + 2, (curl + curr) / 2 + 1, curr); if (mini[curin * 2 + 2] <= qval && qval <= maxi[curin * 2 + 2]) return rmost(curin * 2 + 2, (curl + curr) / 2 + 1, curr); return rmost(curin * 2 + 1, curl, (curl + curr) / 2); } int qin; int qry(int curin, int curl, int curr) { lzy(curin, curl, curr); if (curl == curr) { return maxi[curin]; } int mid = (curl + curr) / 2; if (qin <= mid) return qry(curin * 2 + 1, curl, mid); return qry(curin * 2 + 2, mid + 1, curr); } int main() { int n; cin >> n; vector<pair<int, int>> vpii(n); for (auto& [a, b] : vpii) cin >> a >> b; sort(vpii.begin(), vpii.end()); ss = vpii.back().first; mini = maxi = lz = vector<int>(4 * ss); for (auto [height, amt] : vpii) { int l = height - amt; qin = l; int val = qry(0, 0, ss - 1); qval = val; int ll = lmost(0, 0, ss - 1), rr = min(height - 1, rmost(0, 0, ss - 1)); if (rr == height - 1) { ql = ll, qr = ll + amt - 1; upd(0, 0, ss - 1); } else { ql = rr + 1, qr = height - 1; upd(0, 0, ss - 1); int k = amt - (qr - ql + 1); ql = ll, qr = ql + k - 1; upd(0, 0, ss - 1); } } long long ans = 0; for (int i = 0; i < ss; i++) { qin = i; long long smth = qry(0, 0, ss - 1); ans += smth * (smth - 1) / 2; } cout << ans << "\n"; }
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...