Submission #1344160

#TimeUsernameProblemLanguageResultExecution timeMemory
1344160Jakub_WozniakThe short shank; Redemption (BOI21_prison)C++20
35 / 100
2095 ms29648 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define st first
#define nd second
const ll maxn = 500000+912;
vector<vector<int>> dp;
int t[maxn];
int n , D , T;

void rek(int i1 , int i2 , int l , int r , int d)
{
    if(i2 < i1)return ;
    int i = (i1+i2)/2;

    dp[i][d] = maxn*10+124;
    int COST = 0;
    int Pop = 0;
    int opt = -1;
    for(int j =  i+1 ; j <= r ; j++)
    {
        Pop--;
        Pop = max(Pop,t[j-1]);
        if(Pop >= 0)COST++;

        if(dp[i][d] > dp[j][d-1] + COST)opt = j;
        dp[i][d] = min(dp[i][d] , dp[j][d-1] + COST);
    }
    rek(i1,i-1,l,opt,d);
    rek(i+1,i2,opt,r,d);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> D >> T;
    for(int i = 1; i<= n ;i++)
    {
        cin >> t[i];
        t[i] = T-t[i];
    }



    dp.resize(n+5);
    for(int i = 0 ; i <= n+3 ; i++)dp[i].resize(D+3);

    for(int i = 1; i <= n ; i++)dp[i][0] = maxn*123+15;
    for(int d = 1 ; d <= D+1 ; d++)
    {
        rek(1,n,1,n+1,d);
    }

    cout << dp[1][D+1] << '\n';

    return 0;
}
#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...