Submission #99734

#TimeUsernameProblemLanguageResultExecution timeMemory
99734songc허수아비 (JOI14_scarecrows)C++14
100 / 100
752 ms67532 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;

int N;
long long ans;
pii A[202020];

struct Node{
    vector<pii> V;
    Node *lc=NULL, *rc=NULL;
};

void update(Node *now, int s, int e, pii P){
    if (e < P.second || P.second < s) return;
    if (s == e) {
        now->V.push_back(P);
        return;
    }
    int mid = (s+e)/2;
    if (now->lc == NULL) now->lc = new Node;
    update(now->lc, s, mid, P);
    if (now->rc == NULL) now->rc = new Node;
    update(now->rc, mid+1, e, P);

    while (!now->V.empty() && now->V.back().second < P.second) now->V.pop_back();
    now->V.push_back(P);
}

int query(Node *now, int s, int e, int xlim, int ylim){
    if (ylim < s) return xlim;
    if (e <= ylim){
        auto k = lower_bound(now->V.begin(), now->V.end(), pii(xlim, 0));
        if (k == now->V.end()) return xlim;
        ans += now->V.end() - k;
        return now->V.back().first;
    }
    int mid = (s+e)/2;
    if (now->rc != NULL) xlim = query(now->rc, mid+1, e, xlim, ylim);
    if (now->lc != NULL) xlim = query(now->lc, s, mid, xlim, ylim);
    return xlim;
}

int main(){
    scanf("%d", &N);
    for (int i=1; i<=N; i++) scanf("%d %d", &A[i].first, &A[i].second);
    sort(A+1, A+N+1, [&](pii X, pii Y){
        return X.second < Y.second;
    });
    for (int i=1; i<=N; i++) A[i].second = i;
    sort(A+1, A+N+1);
    Node *Tree = new Node;
    for (int i=1; i<=N; i++){
        query(Tree, 1, N, 0, A[i].second);
        update(Tree, 1, N, A[i]);
    }
    printf("%lld\n", ans);
    return 0;
}

Compilation message (stderr)

scarecrows.cpp: In function 'int main()':
scarecrows.cpp:45:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &N);
     ~~~~~^~~~~~~~~~
scarecrows.cpp:46:35: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for (int i=1; i<=N; i++) scanf("%d %d", &A[i].first, &A[i].second);
                              ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...