제출 #1265850

#제출 시각아이디문제언어결과실행 시간메모리
1265850asemoonabiLiteh and Newfiteh (INOI20_litehfiteh)C++20
100 / 100
418 ms284560 KiB
#include<bits/stdc++.h>
using namespace std ; 
typedef long long ll ;
#define el '\n'
const ll maxn = 1e5 + 100 ;
const ll maxk = 19 ;
const ll mod = 1e9 + 7 ;
const ll oo = 1e15 + 7 ;
ll n , a[maxn] , dp[maxn][maxk][maxk] , dp2[maxn] ;
void solve(){
    ll mx = 0 ;
    cin>>n ; for(ll i = 0 ; i < n ; i++){cin>>a[i];a[i] = max(mx,a[i]);}
    if(maxk <= mx){cout<<-1<<el;return;}
    for(ll i = 0 ; i < n ; i++){
        for(ll k = 0 ; k < maxk ; k++){
            dp[i][0][k] = oo ;
        }
    }
    for(ll i = 0 ; i < n ; i++){
        dp[i][0][a[i]] = 0 ;
        if(0 < a[i]){dp[i][0][a[i]-1] = 1;}
    }
    for(ll x = 1 ; x < maxk-1 ; x++){
        for(ll i = 0 ; i < n ; i++){
            if(n < i+(1<<x)){break;}
            for(ll k = 0 ; k < maxk-1 ; k++){
                ll A1 = dp[i][x-1][k+1] + dp[i+(1<<(x-1))][x-1][k+1] + 1 ;
                ll A2 = dp[i][x-1][k] + dp[i+(1<<(x-1))][x-1][k] ;
                ll A = min(A1,A2) ; A = min(A,oo) ;
                dp[i][x][k] = A ;
            }
        }
    }
    for(ll i = 0 ; i < n; i++){
        dp2[i] = oo ;
        for(ll x = 0 ; x < maxk-1 ; x++){
            ll ind = i-(1<<x) ;
            if(i-(1<<x) == -1){dp2[i] = min(dp2[i],dp[0][x][0]);}
            if(ind < 0){continue;}
            dp2[i] = min(dp2[i],dp2[ind]+dp[ind+1][x][0]) ;
        }
    }
    cout<<((dp2[n-1] < oo) ? dp2[n-1] : -1)<<el ;
    return ;
}
int main(){
    solve() ;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...