제출 #1198227

#제출 시각아이디문제언어결과실행 시간메모리
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...