제출 #967879

#제출 시각아이디문제언어결과실행 시간메모리
967879vjudge1Financial Report (JOI21_financial)C++17
100 / 100
503 ms27648 KiB
#include <bits/stdc++.h>
#define getbit(i, j) ((i >> j) & 1)
#define maxn 300005
#define name "main"
using namespace std;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

long long GetRandom(long long l, long long r)
{
    return uniform_int_distribution<long long> (l, r)(rng);
}

int n,d,a[maxn],st[maxn*4],dp[maxn],dem[maxn],sl,res,lazy[maxn*4],mod=-1e9;
pair<int,int> b[maxn],tt[maxn*4];

void build(int id,int l,int r)
{
    if(l>r) return;
    if(l==r)
    {
        st[id]=mod;
        tt[id]={1e9,0};
        return;
    }
    int mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    st[id]=-1e9;
    tt[id]={1e9,0};
}

void updatest(int id,int l,int r,int vt,int val)
{
    if(l>vt||r<vt) return;
    if(l==r)
    {
        st[id]=max(st[id],val);
        if(val==0) st[id]=0;
        return;
    }
    int mid=(l+r)/2;
    updatest(id*2,l,mid,vt,val);
    updatest(id*2+1,mid+1,r,vt,val);
    st[id]=max(st[id*2],st[id*2+1]);
}

int get(int id,int l,int r,int d,int c)
{
    if(l>c||r<d) return 0;
    if(l>=d&&r<=c) return st[id];
    int mid=(l+r)/2;
    return max(get(id*2,l,mid,d,c),get(id*2+1,mid+1,r,d,c));
}

void lazy1(int id)
{
    int val=lazy[id];
    lazy[id]=0;
    lazy[id*2]=max(lazy[id*2],val);
    lazy[id*2+1]=max(lazy[id*2+1],val);
    if(tt[id*2].first!=1e9) tt[id*2].first=max(tt[id*2].first,val);
    if(tt[id*2+1].first!=1e9) tt[id*2+1].first=max(tt[id*2+1].first,val);
}

void updatett(int id,int l,int r,int d,int c,int val)
{
    if(l>c||r<d) return;
    if(l>=d&&r<=c)
    {
        if(val==0)
        {
            tt[id].first=1e9;
            tt[id].second=0;
            return;
        }
        else if(d==c)
        {
            tt[id].first=val;
            tt[id].second=l;
            return;
        }
        else
        {
            if(tt[id].first==1e9) return;
            tt[id].first=max(tt[id].first,val);
            lazy[id]=max(lazy[id],val);
            return;
        }
    }
    int mid=(l+r)/2;
    lazy1(id);
    updatett(id*2,l,mid,d,c,val);
    updatett(id*2+1,mid+1,r,d,c,val);
    tt[id]=tt[id*2];
    if(tt[id].first>tt[id*2+1].first) tt[id]=tt[id*2+1];
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
//    if(fopen(name".inp","r"))
//    {
//        freopen(name".inp","r",stdin);
//        freopen(name".out","w",stdout);
//    }
    cin >> n >> d;
    for(int i=1;i<=n;i++)
    {
        cin >> a[i];
        b[i]={a[i],i};
    }
    sort(b+1,b+n+1);
    sl=1;
    a[b[1].second]=sl;
    for(int i=2;i<=n;i++)
    {
        if(b[i].first>b[i-1].first) sl++;
        a[b[i].second]=sl;
    }

    build(1,1,sl);
    for(int i=1;i<=n;i++)
    {
        while(i-tt[1].first>d)
        {
            int val=tt[1].second;
//            cout<<val<<' '<<tt[1].first<<' '<<i<<'\n';;
            updatest(1,1,sl,val,0);
            updatett(1,1,sl,val,val,0);
        }
        dp[i]=max(1,get(1,1,sl,1,a[i]-1)+1);
        updatest(1,1,sl,a[i],dp[i]);
        updatett(1,1,sl,a[i],a[i],i);
        updatett(1,1,sl,a[i]+1,sl,i);
        res=max(res,dp[i]);
    }
    cout<<res;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...