Submission #878969

#TimeUsernameProblemLanguageResultExecution timeMemory
878969eitanelbSparklers (JOI17_sparklers)C++14
100 / 100
24 ms2616 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

bool ok(int n, int k, vector<int>&ve, ll m){
    vector<ll> v(n);
    for(int i=0;i<n;i++) v[i] = ve[i] - 2*m*i;
    //for(int i : v) cout<<i<<' '; cout<<endl;
    
    int bl = k-1, sr = k-1;
    for(int i=k-1;i>=0;i--) if(v[i] > v[bl]) bl=i;
    for(int i=k-1;i<n;i++) if(v[i] < v[sr]) sr=i;
    int nl=k-1, nr=k-1;
    ll mxl=v[k-1], mnr=v[k-1];
    while(nl > bl || nr < sr){
        int nnr=nr, nnl=nl;
        
        while(nl>bl && v[nl-1]>=mnr){ nl--; if(v[nl] > mxl) mxl=v[nl]; }
        while(nr<sr && v[nr+1]<=mxl){ nr++; if(v[nr] < mnr) mnr=v[nr]; }
        
        if(nnr==nr && nnl==nl) break;
    }
    if(nl > bl || nr < sr)return 0;
    
    nl=0; nr=n-1;
    mxl=v[0]; mnr=v[n-1];
    if(mnr > mxl) return 0;
    while(nl < bl || nr > sr){
        int nnr=nr, nnl=nl;
        
        while(nl<bl && v[nl+1]>=mnr){ nl++; if(v[nl] > mxl) mxl=v[nl]; }
        while(nr>sr && v[nr-1]<=mxl){ nr--; if(v[nr] < mnr) mnr=v[nr]; }
        
        if(nnr==nr && nnl==nl) break;
    }
    if(nl < bl || nr > sr)return 0;
    return 1;
    
    /*bool dp[n][n];
    for(int i=0;i<n;i++)for(int j=0;j<n;j++) dp[i][j]=0;
    dp[k-1][k-1]=1;
    for(int sz=2;sz<=n;sz++){
        for(int i=0;i+sz-1 < n;i++){
            if((v[i+sz-1] <= v[i]) && (dp[i][i+sz-2] || dp[i+1][i+sz-1])) dp[i][i+sz-1]=1;
        }
    }
    return dp[0][n-1];*/
}
int func(int n, int k, int t, vector<int>&v){
    int s=0, e=1e9, m;
    while(e>s){
        m = (e+s)/2;
        if(ok(n,k,v,m)) e=m;
        else s=m+1;
    }
    return (s+t-1)/t;
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    int n,k,t;
    cin>>n>>k>>t;
    vector<int> v(n);
    for(int i=0;i<n;i++) cin>>v[i];
    
    int res = func(n,k,t,v);
    
    cout<<res<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...