Submission #1221881

#TimeUsernameProblemLanguageResultExecution timeMemory
1221881svtkFinancial Report (JOI21_financial)C++20
28 / 100
4097 ms227404 KiB
#include <iostream>
#include <vector>
#include <set>
using namespace std;
using pii = pair<int, int>;

const int N = 7005;
const int S = N+1;
const int INF = 1'000'000'005;

int n, d;
int a[N];

int f[S][N]; //minimalni mozna hodnota "maximalni a_x v rade se skorem s koncici i"

set<pii> mins[S];
int right_inc[S];
int check(int l, int r, int s){
    while(right_inc[s] < r){
        right_inc[s]++;
        if(right_inc[s]-d >= 0){
            mins[s].erase({f[s][right_inc[s]-d], right_inc[s]-d});
        }
        if(right_inc[s] < n){
            mins[s].insert({f[s][right_inc[s]], right_inc[s]});
        }
    }
    return mins[s].begin()->first;
}

int main(){
    cin >> n >> d;
    for(int i=0; i<n; i++){
        cin >> a[i];
    }

    for(int i=0; i<n+1; i++){
        right_inc[i] = -1;
        for(int j=0; j<n+1; j++){
            f[i][j] = INF;
        }
    }

    for(int i=0; i<n; i++){
        f[1][i] = a[i];
        for(int s=2; s<=i+1; s++){
            if(check(i-d, i-1, s-1) < a[i]){
                f[s][i] = a[i];
            } else {
                f[s][i] = check(i-d, i-1, s);
            }
        }
    }

    for(int s=n; s>=0; s--){
        if(f[s][n-1] != INF){
            cout << s << endl;
            break;
        }
    }

    
    /*for(int i=0; i<n+1; i++){
        for(int j=0; j<n; j++){
            if(f[i][j]!=INF) cout << f[i][j] << "    ";
            else cout << 'X' << "    ";
        }
        cout << endl;
    }*/
    

    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...