Submission #1090215

#TimeUsernameProblemLanguageResultExecution timeMemory
1090215eysbutnoSails (IOI07_sails)C++17
100 / 100
65 ms3164 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = array<int, 2>; #define all(x) begin(x), end(x) #define sz(x) (int) (x).size() template<typename T> struct FenwickTree { int n; vector<T> arr; FenwickTree(int _n) : n(_n + 1), arr(n) {} /** @return sum on [0, idx] */ T pre(int idx) { T tot = 0; for (++idx; idx > 0; idx -= idx & -idx) { tot += arr[idx]; } return tot; } /** changes the location at idx by dx */ void upd(int idx, T dx) { for (++idx; idx < n; idx += idx & -idx) { arr[idx] += dx; } } /** @return sum on [l, r] */ T qry(int l, int r) { return pre(r) - pre(l - 1); } }; template <typename T, typename F> T first_true(T low, T high, const F &fn) { while (low < high) { T mid = low + (high - low) / 2; fn(mid) ? high = mid : low = mid + 1; } return low; } int main() { cin.tie(0) -> sync_with_stdio(0); int n; cin >> n; vector<int> h(n), k(n); for (int i = 0; i < n; i++) { cin >> h[i] >> k[i]; } vector<int> ord(n); iota(all(ord), 0); sort(all(ord), [&](int i, int j) -> bool { return h[i] < h[j]; }); const int MX = *max_element(all(h)); FenwickTree<int> ft(MX + 1); for (int i : ord) { int last = h[i] - k[i]; int val = ft.pre(last); if (last == 0 || ft.pre(last - 1) != val) { ft.upd(last, 1); ft.upd(h[i], -1); } else { int idx_1 = first_true(0, h[i], [&](int x) -> bool { return ft.pre(x) < val; }); int idx_2 = first_true(0, h[i], [&](int x) -> bool { return ft.pre(x) <= val; }); ft.upd(idx_1, 1); ft.upd(h[i], -1); ft.upd(idx_2, 1); ft.upd(idx_2 + k[i] - (h[i] - idx_1), -1); } } ll res = 0; for (int i = 0; i < MX; i++) { int cnt = ft.pre(i); res += 1ll * cnt * (cnt - 1) / 2; } cout << res << "\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...