Submission #1169701

#TimeUsernameProblemLanguageResultExecution timeMemory
11697011bin허수아비 (JOI14_scarecrows)C++20
100 / 100
372 ms10860 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(v) v.begin(), v.end()
typedef long long ll;
const int B = 1<<18;
ll ans, n, seg[B * 2];

void upd(int ix, int v) {
    ix += B;
    while (ix) {
        seg[ix] += v;
        ix >>= 1;
    }
}

ll sum(int l, int r) {
    ll ret = 0;
    l += B; r += B;
    while (l <= r) {
        if (l & 1) ret += seg[l++];
        if (!(r & 1)) ret += seg[r--];
        l >>= 1; r >>= 1;
    }
    return ret;
}

void comp(vector<int>& v) {
    vector<int> t;
    for (int & x: v) t.emplace_back(x);
    sort(all(t));
    for (int i = 0; i < v.size(); i++) v[i] = lower_bound(all(t), v[i])  - t.begin();
}

void dnc(int l, int r, vector<pair<int,int>> & v) {
    // cout << l << ' ' << r << ' ' << (l + r) / 2 << ' ' << ans << endl;
    if (l == r) return;
    int m = (l + r) / 2;
    stack<int> s1, s2;
    auto s1pop = [&] {
        upd(v[s1.top()].first, -1); s1.pop();
    };
    vector<pair<int, int>> v1, v2;
    for (int i = 0; i < v.size(); i++) {
        auto&[y, x] = v[i];
        if (x <= m) {
            v1.emplace_back(v[i]);
            while (s1.size() && v[s1.top()].second < x) s1pop();
            s1.emplace(i); upd(y, 1);
        }
        else {
            v2.emplace_back(v[i]);
            while (s2.size() && v[s2.top()].second > x) s2.pop();
            ans += sum((s2.empty() ? 0 : v[s2.top()].first + 1), y - 1);
            s2.emplace(i);
        }
    }
    // cout << "L : ";
    // for (auto&[y, x] : v1) cout << x << ' ';
    // cout << endl;
    // cout << "R : ";
    // for (auto&[y, x] : v2) cout << x << ' ';
    // cout << endl;
    while (s1.size()) s1pop();
    dnc(l, m, v1); dnc(m + 1, r, v2);
}

int main(void){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n;
    vector<int> X(n),Y(n);
    for (int i = 0; i < n; i++) cin >> X[i] >> Y[i];
    comp(X);comp(Y);
    vector<pair<int, int>> v(n);
    for (int i = 0; i < n; i++) v[i] = {Y[i], X[i]};
    sort(all(v));
    dnc(0, n - 1, v);
    cout << ans;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...