제출 #1358532

#제출 시각아이디문제언어결과실행 시간메모리
1358532NewtonabcDeveloper (BOI25_dev)C++20
100 / 100
157 ms34856 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
ll dp[2][27][2];
ll a[N];
vector<int> pos[N];
int main(){
    int n; cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        for(int j=i-4;j<=i+4;j++){
            if(j<1 || j>n) continue;
            for(int x=-1;x<=1;x++) pos[i].push_back(a[j]+x);
        }
        sort(pos[i].begin(),pos[i].end());
        pos[i].erase(unique(pos[i].begin(),pos[i].end()),pos[i].end());
    }
    ll ans=LLONG_MAX;
    if(n==1){
        cout<<0;
        return 0;
    }
    for(int i=0;i<pos[1].size();i++){
        dp[1][i][0]=dp[1][i][1]=abs(a[1]-pos[1][i]);
    }
    for(int i=2;i<=n;i++){
        int now=i&1;
        int pre=(i+1)&1;
        for(int j=0;j<pos[i].size();j++) dp[now][j][0]=dp[now][j][1]=1e18;
        int p=0;
        ll mn=1e18;
        for(int j=0;j<pos[i].size();j++){
            while(p<pos[i-1].size() && pos[i-1][p]<pos[i][j]){
                mn=min(mn,dp[pre][p][0]);
                p++;
            }
            ll dt=abs(pos[i][j]-a[i]);
            if(p<pos[i-1].size() && pos[i-1][p]==pos[i][j]){
                dp[now][j][1]=min(dp[now][j][1],dp[pre][p][1]+dt);
                dp[now][j][0]=min(dp[now][j][0],dp[pre][p][0]+dt);
            }
            dp[now][j][1]=min(dp[now][j][1],mn+dt);
        }
        mn=1e18;
        p=(int)(pos[i-1].size())-1;
        for(int j=(int)pos[i].size()-1;j>=0;j--){
            while(p>=0 && pos[i-1][p]>pos[i][j]){
                mn=min(mn,dp[pre][p][1]);
                p--;
            }
            ll dt=abs(pos[i][j]-a[i]);
            dp[now][j][0]=min(dp[now][j][0],mn+dt);
        }
        if(i==n){
            for(int j=0;j<pos[i].size();j++){
                ans=min({ans,dp[now][j][0],dp[now][j][1]});
            }
        }
    }
    cout<<ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…