站外 AC,SPOJ WA 求助
查看原帖
站外 AC,SPOJ WA 求助
237530
rzh123楼主2023/4/26 10:29
#include <bits/stdc++.h>
using namespace std;
constexpr unsigned N=3e5+7;
int n,qc;
struct V{int b,c;};
array<V,N> a;
array<int,N> f;
inline void disc(){
    static int d[N],dc;
    dc=0;for(int i{1};i<=n;++i) d[++dc]=a[i].b;
    std::sort(d+1,d+dc+1),dc=unique(d+1,d+dc+1)-d-1;
    for(int i{1};i<=n;++i) a[i].b=lower_bound(d+1,d+dc+1,a[i].b)-d;
    dc=0;for(int i{1};i<=n;++i) d[++dc]=a[i].c;
    std::sort(d+1,d+dc+1),dc=unique(d+1,d+dc+1)-d-1;
    for(int i{1};i<=n;++i) a[i].c=lower_bound(d+1,d+dc+1,a[i].c)-d;
}
struct Tql{
    array<int,N> s;
    static inline int l(int x){return x&(-x);}
    inline void add(int x,int v){for(;x<=n;x+=l(x))s[x]=std::max(s[x],v);}
    inline void del(int x){for(;x<=n;x+=l(x))s[x]=0;}
    inline int max(int k){int t{0};for(;k;k^=l(k))t=std::max(t,s[k]);return t;}
}tr;
void solve(int l,int r){
    // printf("solve %d %d\n",l,r);
    array<int,N> ord;
    if(l==r) return (void)++f[l];
    int m{(l+r)>>1};
    solve(l,m);
    iota(begin(ord)+l,begin(ord)+r+1,l);
    std::sort(begin(ord)+l,begin(ord)+r+1,
        [](int ia,int ib)->bool{
            V va{a[ia]},vb{a[ib]};
            if(va.b!=vb.b) return va.b<vb.b;
            return va.c<vb.c;
        }
    );
    for(int ii{l};ii<=r;++ii){
        int i{ord[ii]};
        if(i<=m) tr.add(a[i].c,f[i]);
        else f[i]=std::max(f[i],tr.max(a[i].c-1)+1);
    }
    for(int i{l};i<=m;++i) tr.del(a[i].c);
    solve(m+1,r);
}
int32_t main(){
    scanf("%d",&n);
    for(int i{1};i<=n;++i) scanf("%d%d",&a[i].b,&a[i].c),f[i]=0;
    disc();
    // fputs("ASFSSDF\n",stderr);
    solve(1,n);
    // fputs("ASFSSDF\n",stderr);
    printf("%d\n",*max_element(f.begin()+1,f.begin()+n+1));
    return EXIT_SUCCESS;
}
2023/4/26 10:29
加载中...