Submission #1243930

#TimeUsernameProblemLanguageResultExecution timeMemory
1243930m5588ohammedFinancial Report (JOI21_financial)C++20
5 / 100
799 ms100888 KiB
#include <bits/stdc++.h>
#define endl "\n"
#define mod 1000000007
using namespace std;
int n,d,arr[300010];
int bigL[300010],bigR[300010],dp[300010];
vector <int> query[300010],del[300010],ins[300010];
void compress(){
    set <int> comp;
    map <int,int> key;
    for(int i=1;i<=n;i++){
        comp.insert(arr[i]);
    }
    int cnt=0;
    for(int i:comp){
        key[i]=++cnt;
    }
    for(int i=1;i<=n;i++) arr[i]=key[arr[i]];
    return;
}
void stack_trick(){
    vector <int> qu;
    for(int i=1;i<=n;i++){
        while(!qu.empty()&&arr[qu.back()]<=arr[i]){ qu.pop_back();}
        if(qu.size()==0) bigL[i]=0;
        else bigL[i]=qu.back();
        qu.push_back(i);
    }
    qu.clear();
    for(int i=n;i>=1;i--){
        while(!qu.empty()&&arr[qu.back()]<=arr[i]){ qu.pop_back();}
        if(qu.size()==0) bigR[i]=n+1;
        else bigR[i]=qu.back();
        qu.push_back(i);
    }
    qu.clear();
}
const int N=(1<<19);
int Tree[N*2+5][2];
multiset <int> lf[300001];
void update1(int i){
    i+=N;
    Tree[i][0]=*lf[i-N].rbegin();
    i/=2;
    while(i!=0){
        Tree[i][0]=max(Tree[i*2][0],Tree[i*2+1][0]);
        i/=2;
    }
    return;
}
void update2(int i,int val){
    i+=N;
    Tree[i][1]=val;
    i/=2;
    while(i!=0){
        Tree[i][1]=max(Tree[i*2][1],Tree[i*2+1][1]);
        i/=2;
    }
    return;
}
int solve(int l1,int r1,int i,int l,int r,int u){
    if(l1>r||l>r1) return 0;
    if(l<=l1&&r1<=r) return Tree[i][u];
    return max(solve(l1,(l1+r1)/2,i*2,l,r,u),solve((l1+r1)/2+1,r1,i*2+1,l,r,u));
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>d;
    for(int i=1;i<=n;i++) cin>>arr[i];
    compress();
    stack_trick();
    for(int i=1;i<=n;i++){
        lf[i].insert(0);
        query[bigL[i]].push_back(i);
        ins[bigR[i]].push_back(i);
        del[min(n+1,bigR[i]+d-1)].push_back(i);
    }
    int mx=0;
    for(int i=1;i<=n;i++){
        for(int j:ins[i]){
            update2(j,dp[j]);
        }
        dp[i]=max(dp[i],solve(0,N-1,1,bigL[i]+1,i-1,1)+1);
        lf[arr[i]].insert(dp[i]);
        update1(arr[i]);
        for(int j:del[i]){
            lf[arr[j]].erase(lf[arr[j]].find(dp[j]));
            update1(arr[j]);
        }
        for(int j:query[i]){
            dp[j]=solve(0,N-1,1,0,arr[j]-1,0)+1;
            lf[arr[j]].insert(dp[j]);
        }
        mx=max(mx,dp[i]);
    }
    cout<<mx<<endl;
}
#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...