제출 #1221893

#제출 시각아이디문제언어결과실행 시간메모리
1221893svtkFinancial Report (JOI21_financial)C++20
48 / 100
3218 ms615304 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[N]; 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--){ while(rekordy.size() and a[i] >= rekordy.top()){ rekordy.pop(); } 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...