Submission #1221897

#TimeUsernameProblemLanguageResultExecution timeMemory
1221897svtkFinancial Report (JOI21_financial)C++20
60 / 100
3177 ms615484 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
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[300'005];

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

priority_queue<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].push({-f[s][right_inc[s]], right_inc[s]});
        }
    }
    while(mins[s].top().second <= right_inc[s]-d) mins[s].pop();
    return -mins[s].top().first;
}

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

    if(d==1){
        int ans = 1;
        stack<int> rekordy;
        for(int i=n-1; i>=0; i--){
            if(rekordy.size()){
                while(a[i] >= rekordy.top()){
                    rekordy.pop();
                    if(rekordy.empty()) break;
                }
            }
            rekordy.push(a[i]);
            ans = max(ans, (int)rekordy.size());
        }
        cout << ans << endl;

        return 0;
    }

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