Submission #126094

#TimeUsernameProblemLanguageResultExecution timeMemory
126094ksmzzang2003허수아비 (JOI14_scarecrows)C++14
100 / 100
594 ms67540 KiB
#include <bits/stdc++.h>  
#define pii pair<int, int>  
using namespace std;  
  
int N;  
long long ans;  
pii P[202020];  
  
struct Node{  
    vector<pii> V;  
    Node *lc, *rc;  
  
    Node(){  
        lc = rc = NULL;  
    }  
};  
  
void update(Node *now,int s,int e,pii p)
{
    if(s>p.second || e<p.second) 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,pii p,int xlim)
{
    if(e<=p.second) return xlim;
    if(s>p.second)
    {
        auto lit = lower_bound(now->V.rbegin(),now->V.rend(),p);
        auto rit = lower_bound(now->V.rbegin(),now->V.rend(),pii(xlim,0));
        if(lit==rit) return xlim;
        ans+=(rit-lit);
        return lit->first;
    }
    int mid = (s+e)/2;
    if(now->lc != NULL) xlim = query(now->lc,s,mid,p,xlim);
    if(now->rc != NULL) xlim = query(now->rc,mid+1,e,p,xlim);
    return xlim;
}
  
int main(){  
    scanf("%d", &N);  
    for (int i=1; i<=N; i++) scanf("%d %d", &P[i].first, &P[i].second);  
  
    sort(P+1, P+N+1, [&](pii A, pii B){ return A.second < B.second; });  
    for (int i=1; i<=N; i++) P[i].second = i;  
    sort(P+1, P+N+1);  
    for (int i=1; i<=N; i++) P[i].first = i;  
    
    Node *Tree = new Node;  
    for (int i=N; i>0; i--){  
        update(Tree, 1, N, P[i]);  
        query(Tree, 1, N, P[i], N+1);  
    }  
    printf("%lld", ans);  
}

Compilation message (stderr)

scarecrows.cpp: In function 'int main()':
scarecrows.cpp:53:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &N);  
     ~~~~~^~~~~~~~~~
scarecrows.cpp:54: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", &P[i].first, &P[i].second);  
                              ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...