#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |