Submission #1265897

#TimeUsernameProblemLanguageResultExecution timeMemory
1265897canhnam357Sails (IOI07_sails)C++20
100 / 100
128 ms3720 KiB
#include <bits/stdc++.h> using namespace std; //#define int long long #define all(x) x.begin(), x.end() int st[1 << 18] = {}, lz[1 << 18] = {}, st2[1 << 18] = {}; void down(int id) { if (!lz[id]) return; lz[id << 1] += lz[id]; lz[id << 1 | 1] += lz[id]; st[id << 1] += lz[id]; st[id << 1 | 1] += lz[id]; st2[id << 1] += lz[id]; st2[id << 1 | 1] += lz[id]; lz[id] = 0; } void add_range(int u, int v, int val, int id = 1, int l = 1, int r = 1 << 17) { if (l > r) return; if (r < u || l > v) return; if (l >= u && r <= v) { st[id] += val; st2[id] += val; lz[id] += val; return; } down(id); int mid = (l + r) >> 1; add_range(u, v, val, id << 1, l, mid); add_range(u, v, val, id << 1 | 1, mid + 1, r); st[id] = max(st[id << 1], st[id << 1 | 1]); st2[id] = min(st2[id << 1], st2[id << 1 | 1]); } int get(int pos, int id = 1, int l = 1, int r = 1 << 17) { if (l == r) return st[id]; down(id); int mid = (l + r) >> 1; if (pos <= mid) return get(pos, id << 1, l, mid); return get(pos, id << 1 | 1, mid + 1, r); } int find_left(int val, int id = 1, int l = 1, int r = 1 << 17) { if (l == r) return l; down(id); int mid = (l + r) >> 1; if (st2[id << 1] <= val) return find_left(val, id << 1, l, mid); return find_left(val, id << 1 | 1, mid + 1, r); } void find_right(int val, int h, int& ans, int id = 1, int l = 1, int r = 1 << 17) { if (ans != -1) return; if (l > h) return; if (l == r) { ans = l; return; } down(id); int mid = (l + r) >> 1; if (st[id << 1 | 1] >= val) find_right(val, h, ans, id << 1 | 1, mid + 1, r); if (st[id << 1] >= val) find_right(val, h, ans, id << 1, l, mid); } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<pair<int, int>> a; for (int i = 0; i < n; i++) { int h, k; cin >> h >> k; a.emplace_back(h, k); } sort(all(a)); for (auto x : a) { int h = x.first, k = x.second; if (h == k) add_range(1, h, 1);//, cout << "FULL\n"; else { if (get(h - k) != get(h - k + 1)) { //cout << "ENOUGH\n"; add_range(h - k + 1, h, 1); } else { int val = get(h - k + 1); int l = find_left(val); int r = -1; find_right(val, h, r); add_range(r + 1, h, 1); k -= h - r; add_range(l, l + k - 1, 1); //cout << l << ' ' << r << '\n'; } } //for (int i = 1; i <= 5; i++) cout << get(i) << ' '; //cout << '\n'; } long long ans = 0; for (int i = 1; i <= 100000; i++) { long long s = get(i); ans += s * (s - 1) / 2; } cout << ans; 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...
#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...