제출 #1244082

#제출 시각아이디문제언어결과실행 시간메모리
1244082m5588ohammedFinancial Report (JOI21_financial)C++20
17 / 100
2389 ms74492 KiB
#include <bits/stdc++.h>
#define endl "\n"
#define mod 1000000007
using namespace std;
struct node{
    int suf,pre,ans,siz=1;
};
const int N=(1<<20);
int MX[N*2+5];
node Tree[N*2+5];
node merge(node A,node B){
    node C;
    C.pre=A.pre;
    if(A.pre==A.siz) C.pre+=B.pre;
    C.suf=B.pre;
    if(B.suf==B.siz) C.suf+=A.suf;
    C.ans=max({A.ans,B.ans,C.pre,C.suf});
    C.siz=A.siz+B.siz;
    return C;
}
void update(int i){
    i+=N;
    Tree[i].suf=Tree[i].pre=Tree[i].siz=Tree[i].ans=1;
    i/=2;
    while(i!=0){
        Tree[i]=merge(Tree[i*2],Tree[i*2+1]);
        i/=2;
    }
    return;
}
node solve(int l1,int r1,int i,int l,int r){
    if(l1>r||l>r1) return {0,0,0,1};
    if(l<=l1&&r1<=r) return Tree[i];
    return merge(solve(l1,(l1+r1)/2,i*2,l,r),solve((l1+r1)/2+1,r1,i*2+1,l,r));
}
int n,d,arr[300010],pt[300010];
int dp[300010];
void update2(int i){
    i+=N;
    MX[i]=dp[i-N];
    i/=2;
    while(i!=0){
        MX[i]=max(MX[i*2],MX[i*2+1]);
        i/=2;
    }
    return;
}
int solve2(int l1,int r1,int i,int l,int r){
    if(l1>r||l>r1) return 0;
    if(l<=l1&&r1<=r) return MX[i];
    return max(solve2(l1,(l1+r1)/2,i*2,l,r),solve2((l1+r1)/2+1,r1,i*2+1,l,r));
}
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 check(int i){
    int l=1,r=i;
    while(l<=r){
        int mid=(l+r)/2;
        if(solve(0,N-1,1,mid,i).ans+1<=d){
            pt[i]=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    return;
}
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();
    vector <int> v[300001];
    for(int i=1;i<=n;i++){
        v[arr[i]].push_back(i);
    }
    for(int val=n;val>=1;val--){
        for(int i:v[val]) check(i);
        for(int i:v[val]) update(i);
    }
    int mx=0;
    for(int val=1;val<=n;val++){
        for(int i:v[val]){
            dp[i]=solve2(0,N-1,1,pt[i],i)+1;
            mx=max(mx,dp[i]);
        }
        for(int i:v[val]) update2(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...