제출 #1256107

#제출 시각아이디문제언어결과실행 시간메모리
1256107rajinnyo구경하기 (JOI13_watching)C++20
0 / 100
1096 ms43332 KiB
#include<bits/stdc++.h>
using namespace std;
// JANGAN LUPA CEK PERLU LL NGGAK
#define pb push_back
#define pii pair<int,int>
#define fi first
#define inf INT_MAX
#define se second
#define miku ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
vector<int>a;
int binser(int x,int dis){
    int l=1,r=x;
    int ans=x;
    while(l<=r){
        int mid=(l+r)/2;
        if(a[x]-a[mid]+1<=dis){
            r=mid-1;
            ans=mid;
        }
        else l=mid+1;
    }
    return ans;
}
signed main(){
    miku
    int n,p,q;cin>>n>>p>>q;
    a.assign(n+1,0);
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a.begin()+1,a.end());
    int l=1,r=a[n]-a[1]+1;
    int ans=0;
    while(l<=r){
        int mid=(l+r)/2;
        int j=1;
        int mini=inf;
        int dp[n+10][q+10];
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            dp[i][0]=dp[binser(i,mid)-1][0]+1;
            // if(mid==2) cout<<i<<" "<<0<<" "<<dp[binser(i,mid)-1][0]<<" "<<1<<endl;
            for(int j=1;j<=q;j++){
                dp[i][j]=dp[binser(i,2*mid)-1][j-1];
                dp[i][j]=min(dp[binser(i,mid)-1][j]+1,dp[i][j]);
                // if(mid==2) cout<<i<<" "<<j<<" "<<dp[binser(i,2*mid)-1][j-1]<<" "<<dp[binser(i,2*mid)-1][j-1]<<endl;
            }
        }
        for(int i=0;i<=q;i++) mini=min(mini,dp[n][i]);
        // cout<<mid<<' '<<mini<<endl;
        if(mini<=p){
            r=mid-1;
            ans=mid;
        }
        else l=mid+1;
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...