제출 #967702

#제출 시각아이디문제언어결과실행 시간메모리
967702vjudge1Financial Report (JOI21_financial)C++17
5 / 100
175 ms17232 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],dd[maxn],mod=-1e9;
pair<int,int> b[maxn];

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

void lazy1(int id)
{
    int val=lazy[id];
    lazy[id]=0;
    lazy[id*2]+=val;
    lazy[id*2+1]+=val;
    st[id*2]+=val;
    st[id*2+1]+=val;
    return;
}

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

void updatema(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);
        return;
    }
    int mid=(l+r)/2;
    lazy1(id);
    updatema(id*2,l,mid,vt,val);
    updatema(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;
    lazy1(id);
    return max(get(id*2,l,mid,d,c),get(id*2+1,mid+1,r,d,c));
}

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);
    int vt=1;
    for(int i=1;i<=n;i++)
    {
        while(vt<i-d)
        {
            if(dd[a[vt]]==vt)
            {
                updategt(1,1,sl,a[vt],a[vt],mod);
            }
            vt++;
        }
        int val=get(1,1,sl,1,a[i]-1);
        dp[i]=max(dp[i],val+1);
//        cout<<i<<' '<<dp[i]<<'\n';
        res=max(res,dp[i]);
        updatema(1,1,sl,a[i],dp[i]);
//        if(i==5) cout<<get(1,1,sl,3,3)<<' '<<a[i]<<'\n';
        dd[a[i]]=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...