Submission #1342944

#TimeUsernameProblemLanguageResultExecution timeMemory
1342944WarinchaiFinancial Report (JOI21_financial)C++20
5 / 100
274 ms62792 KiB
#include<bits/stdc++.h>
using namespace std;

int a[300005];
int dp[300005];
multiset<int>ms[300005];
vector<int>ch[300005];
int p[300005];

int fp(int a){
    if(p[a]==a)return a;
    return p[a]=fp(p[a]);
}

void un(int a,int b){
    a=fp(a),b=fp(b);
    if(a==b)return;
    if(ch[a].size()<ch[b].size())swap(a,b);
    p[b]=a;
    for(auto x:ch[b])ch[a].push_back(x);
}

struct segtree{
    int info[1200005];
    void upd(int st,int en,int i,int pos,int val){
        if(st>pos||en<pos)return;
        if(st==en)return info[i]=val,void();
        int m=(st+en)/2;
        upd(st,m,i*2,pos,val);
        upd(m+1,en,i*2+1,pos,val);
        info[i]=max(info[i*2],info[i*2+1]);
    }
    int fans(int st,int en,int i,int l,int r){
        if(st>r||en<l)return 0;
        if(st>=l&&en<=r)return info[i];
        int m=(st+en)/2;
        return max(fans(st,m,i*2,l,r),fans(m+1,en,i*2+1,l,r));
    }
}tr;

int n,d;

void add(int x,int val){
    ms[x].insert(val);
    tr.upd(1,n,1,x,*(prev(ms[x].end())));
}

void del(int x,int val){
    ms[x].erase(ms[x].lower_bound(val));
    if(ms[x].empty())tr.upd(1,n,1,x,0);
    else tr.upd(1,n,1,x,*(prev(ms[x].end())));
    //cerr<<"del:"<<x<<" "<<*(ms[x].end())<<"\n";
}

void adel(int x){
    x=fp(x);
    for(auto temp:ch[x]){
        del(a[temp],dp[temp]);
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>d;
    vector<int>v;
    for(int i=1;i<=n;i++)cin>>a[i],v.push_back(a[i]);
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    for(int i=1;i<=n;i++)a[i]=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
    for(int i=1;i<=n;i++)p[i]=i,ch[i].push_back(i);
    deque<int>dq;
    for(int i=1;i<=n;i++){
        while(!dq.empty()&&i-dq.front()>d){
            adel(fp(dq.front()));
            dq.pop_front();
        }
        while(!dq.empty()&&a[i]<=a[dq.back()]){
            un(i,dq.back());
            dq.pop_back();
        }
        int temp=tr.fans(1,n,1,1,a[i]-1);
        //cerr<<"temp:"<<temp<<"\n";
        dp[i]=temp+1;
        dq.push_back(i);
        add(a[i],dp[i]);
    }
    int ans=tr.fans(1,n,1,1,n);
    cout<<ans;
}
#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...