Submission #1125609

#TimeUsernameProblemLanguageResultExecution timeMemory
1125609ttamx허수아비 (JOI14_scarecrows)C++20
0 / 100
144 ms11776 KiB
#include<bits/stdc++.h>

using namespace std;

const int N=2e5+5;
const int K=1<<19;
const int INF=INT_MAX/2;

int n;
pair<int,int> a[N],vals[N];
long long ans=0;

struct SegTree{
    struct Node{
        int mn,mn2,cnt;
        Node(){}
        Node(int val):mn(val),mn2(INF),cnt(1){}
        Node(int _mn,int _mn2,int _cnt):mn(_mn),mn2(_mn2),cnt(_cnt){}
        friend Node operator+(const Node &l,const Node &r){
            if(l.mn<r.mn)return Node(l.mn,min(l.mn2,r.mn),l.cnt);
            if(r.mn<l.mn)return Node(r.mn,min(r.mn2,l.mn),r.cnt);
            return Node(l.mn,min(l.mn2,r.mn2),l.cnt+r.cnt);
        }
    }t[K];
    int lz[K];
    void apply(int i,int v){
        if(t[i].mn>=v)return;
        assert(t[i].mn2>v);
        t[i].mn=v;
        lz[i]=max(lz[i],v);
    }
    void push(int i){
        apply(i*2,lz[i]);
        apply(i*2+1,lz[i]);
        lz[i]=0;
    }
    void build(int l,int r,int i){
        lz[i]=0;
        if(l==r)return void(t[i]=Node(INF));
        int m=(l+r)/2;
        build(l,m,i*2);
        build(m+1,r,i*2+1);
        t[i]=t[i*2]+t[i*2+1];
    }
    void build(){
        build(1,n,1);
    }
    int update(int l,int r,int i,int x,int y,int v){
        if(y<l||r<x||v<=t[i].mn)return 0;
        if(x<=l&&r<=y&&v<t[i].mn2)return apply(i,v),t[i].cnt;
        int m=(l+r)/2;
        push(i);
        int res=update(l,m,i*2,x,y,v)+update(m+1,r,i*2+1,x,y,v);
        t[i]=t[i*2]+t[i*2+1];
        return res;
    }
    int update(int x,int y,int v){
        return update(1,n,1,x,y,v);
    }
    void modify(int l,int r,int i,int x,int v){
        if(l==r)return void(t[i]=Node(v));
        int m=(l+r)/2;
        push(i);
        if(x<=m)modify(l,m,i*2,x,v);
        else modify(m+1,r,i*2+1,x,v);
        t[i]=t[i*2]+t[i*2+1];
    }
    void modify(int x,int v){
        modify(1,n,1,x,v);
    }
}seg;

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> a[i].first >> a[i].second;
        a[i].first++,a[i].second++;
        vals[i]={a[i].second,i};
    }
    sort(a+1,a+n+1,greater<pair<int,int>>());
    sort(vals+1,vals+n+1);
    seg.build();
    for(int i=1;i<=n;i++){
        int id=lower_bound(vals+1,vals+n+1,make_pair(a[i].second,i))-vals;
        int id2=lower_bound(vals+1,vals+n+1,make_pair(a[i].second+1,0))-vals;
        ans+=seg.update(id2,n,a[i].second);
        seg.modify(id,0);
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...