Submission #1243917

#TimeUsernameProblemLanguageResultExecution timeMemory
1243917ereringFinancial Report (JOI21_financial)C++20
100 / 100
690 ms160100 KiB
#include <bits/stdc++.h>
#define pb push_back
#define int long long
#define endl '\n'
using namespace std;
const int N=3e5+5,inf=2e18,MOD=1e9+9;
int seg[N*4][3],offset=1,dp[N];
void update(int idx,int val,int t){
    idx+=offset;
    seg[idx][t]=val;
    idx/=2;
    while(idx>0){
        seg[idx][t]=min(seg[idx*2][t],seg[idx*2+1][t]);
        idx/=2;
    }
}
int query(int node,int qlo,int qhi,int lo,int hi,int t){
    if(lo>=qlo && hi<=qhi)return seg[node][t];
    if(lo>qhi || hi<qlo)return inf;
    int mid=(lo+hi)/2;
    return min(query(node*2,qlo,qhi,lo,mid,t),query(node*2+1,qlo,qhi,mid+1,hi,t));
}
set<int> sols[N*4];
void update2(int idx){
    auto it=sols[idx].end();
    it--;
    idx+=offset;
    seg[idx][2]=*it;
    idx/=2;
    while(idx>0){
        seg[idx][2]=max(seg[idx*2][2],seg[idx*2+1][2]);
        idx/=2;
    }
}
int query2(int node,int qlo,int qhi,int lo,int hi){
    if(lo>=qlo && hi<=qhi)return seg[node][2];
    if(lo>qhi || hi<qlo)return -inf;
    int mid=(lo+hi)/2;
    return max(query2(node*2,qlo,qhi,lo,mid),query2(node*2+1,qlo,qhi,mid+1,hi));
}
vector<int> rem[N]; //at time i remove these dp values because u cant take them anymore
signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    for(int i=0;i<N*4;i++){
        for(int j=0;j<2;j++)seg[i][j]=inf;
    }
    int n,d; cin>>n>>d;
    while(offset<n)offset*=2;
    int a[n];
    set<int> comp;
    for(int i=0;i<n;i++){
        cin>>a[i];
        comp.insert(a[i]);
    }
    map<int,int> id;
    int cnt=0;
    for(auto i:comp)id[i]=cnt++;
    for(int i=0;i<n;i++){
        a[i]=id[a[i]];
        update(i,a[i],0);
        sols[a[i]].insert(0);
    }
    vector<int> pos;
    for(int i=n-1;i>n-d-1;i--)pos.pb(i);
    for(int i=n-d-1;i>=0;i--){
        int whn=query(1,a[i]+1,offset-1,0,offset-1,1);
        if(whn!=inf)rem[whn].pb(i);
        else pos.pb(i);
        int mn=query(1,i,i+d-1,0,offset-1,0);
        update(mn,i+d,1);
    }
    for(int i=0;i<n;i++){
        for(auto j:rem[i]){
            sols[a[j]].extract(dp[j]);
            update2(a[j]);
        }
        dp[i]=1;
        if(a[i]>0)dp[i]=query2(1,0,a[i]-1,0,offset-1)+1;
        sols[a[i]].insert(dp[i]);
        update2(a[i]);
    }
    int ans=0;
    for(auto i:pos){
        ans=max(ans,dp[i]);
     //   cout<<i+1<<' '<<dp[i]<<endl;
    }
    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...