Submission #1202143

#TimeUsernameProblemLanguageResultExecution timeMemory
1202143JooDdae허수아비 (JOI14_scarecrows)C++20
100 / 100
228 ms3504 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int n;
vector<array<int, 2>> p;

ll solve(int l, int r) {
    if(l == r) return 0;

    int m = (l+r)/2;
    ll re = solve(l, m) + solve(m+1, r);

    int L = l, R = m+1;
    vector<int> s, s2;
    while(L <= m || R <= r) {
        if(L <= m && (R > r || p[L][1] < p[R][1])) {
            while(!s.empty() && p[s.back()][0] < p[L][0]) s.pop_back();
            s.push_back(L++);
        } else {
            while(!s2.empty() && p[s2.back()][0] > p[R][0]) s2.pop_back();
            int l = 0, r = (int)s.size()-1;
            while(l <= r && !s2.empty()) {
                int m = (l+r)/2;
                if(p[s[m]][1] < p[s2.back()][1]) l = m+1;
                else r = m-1;
            }
            re += (int)s.size()-l;
            s2.push_back(R++);
        }
    }
    sort(p.begin()+l, p.begin()+r+1, [&](auto &a, auto &b) { return a[1] < b[1]; });

    return re;
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n; p.resize(n);
    for(auto &[x, y] : p) cin >> x >> y;

    vector<int> Y;
    for(auto [x, y] : p) Y.push_back(y);
    sort(Y.begin(), Y.end()), Y.erase(unique(Y.begin(), Y.end()), Y.end());
    for(auto &[x, y] : p) y = lower_bound(Y.begin(), Y.end(), y) - Y.begin() + 1;
    sort(p.begin(), p.end());

    cout << solve(0, n-1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...