Submission #1198227

#TimeUsernameProblemLanguageResultExecution timeMemory
119822712345678허수아비 (JOI14_scarecrows)C++20
100 / 100
662 ms33024 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int nx=2e5+5, inf=1e9;

int n, x[nx], y[nx], h[nx], tx, ty;
ll res;
map<int, int> mpx, mpy;

struct segtreebeat
{
    struct node
    {
        int mx, mx2, f;
        node(int mx=0): mx(mx), mx2(0), f(1){}
    } d[4*nx];
    int lz[4*nx];
    node merge(node &l, node &r)
    {
        node res;
        if (l.mx>r.mx) res.mx=l.mx, res.f=l.f, res.mx2=max(l.mx2, r.mx);
        if (l.mx==r.mx) res.mx=l.mx, res.f=l.f+r.f, res.mx2=max(l.mx2, r.mx2);
        if (l.mx<r.mx) res.mx=r.mx, res.f=r.f, res.mx2=max(l.mx, r.mx2);
        return res;
    }
    void apply(int i, int vl)
    {
        if (vl<d[i].mx) d[i].mx=vl, lz[i]=min(lz[i], vl); 
    }
    void push(int i)
    {
        apply(2*i, lz[i]);
        apply(2*i+1, lz[i]);
        lz[i]=inf;
    }
    void build(int l, int r, int i)
    {
        lz[i]=inf;
        if (l==r) return d[i]=node(), void();
        int md=(l+r)/2;
        build(l, md, 2*i);
        build(md+1, r ,2*i+1);
        d[i]=merge(d[2*i], d[2*i+1]);
    }
    int update(int l, int r, int i, int ql, int qr, int vl)
    {
        if (qr<l||r<ql||vl>=d[i].mx) return 0;
        if (ql<=l&&r<=qr&&vl>d[i].mx2) return apply(i, vl), d[i].f;
        int md=(l+r)/2;
        push(i);
        int tmp=update(l, md, 2*i, ql, qr, vl)+update(md+1, r, 2*i+1, ql, qr ,vl);
        d[i]=merge(d[2*i], d[2*i+1]);
        return tmp;
    }
    void open(int l, int r, int i, int idx)
    {
        if (idx<l||r<idx) return;
        if (l==r) return d[i]=node(inf), void();
        int md=(l+r)/2;
        push(i);
        open(l, md, 2*i, idx);
        open(md+1, r, 2*i+1, idx);
        d[i]=merge(d[2*i], d[2*i+1]);
    }
} s;

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n;
    for (int i=1; i<=n; i++) cin>>x[i]>>y[i], mpx[x[i]]=mpy[y[i]]=0;
    for (auto &[x, y]:mpx) y=++tx;
    for (auto &[x, y]:mpy) y=++ty;
    for (int i=1; i<=n; i++) h[mpx[x[i]]]=mpy[y[i]];
    s.build(1, n, 1);
    for (int i=1; i<=n; i++)
    {
        res+=s.update(1, n, 1, 1, h[i] ,h[i]);
        //cout<<"debug "<<i<<' '<<res<<'\n';
        s.open(1, n, 1, h[i]);
    }
    cout<<res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...