제출 #830702

#제출 시각아이디문제언어결과실행 시간메모리
830702vjudge1Safety (NOI18_safety)C++17
4 / 100
504 ms262144 KiB
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int nmax = 200002;
ll S[nmax];
ll dp[5005][5005];
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int N;
    ll H;
    cin >> N >> H;
    for(int i=1; i<=N; i++) {
        cin >> S[i];
    }
    deque<pair<ll,ll>>dd;
    for(int i=0; i<=5000; i++) dp[1][i] = abs(S[1]-i);
    for(int i=2; i<=N; i++) {
        dd.clear();
        for(int j=0; j<=min(5000ll, H); j++) {
            while(!dd.empty() && dd.back().fi > dp[i-1][j]) {
                dd.pop_back();
            }
            dd.push_back({dp[i-1][j],j});
        }
        pair<ll,ll>sem;
        for(int j=0; j<=5000; j++) {
            if(!dd.empty() && dd.front().se < j-H) {
                dd.pop_front();
            }
            sem = dd.front();
            dp[i][j] = sem.fi + abs(S[i]-j);
            if(j-H+1 <= 5000) {
                while(!dd.empty() && dd.back().fi > dp[i-1][j+H+1]) {
                    dd.pop_back();
                }
                dd.push_back({dp[i-1][j+H+1], j+H+1});
            }
        }
    }
    ll jwb = LLONG_MAX;
    for(int i=0; i<=5000; i++) {
        jwb = min(jwb, dp[N][i]);
    }
    cout << jwb << 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...