제출 #1195769

#제출 시각아이디문제언어결과실행 시간메모리
1195769DeathIsAwe선물상자 (IOI15_boxes)C++20
0 / 100
0 ms332 KiB
#include "boxes.h"
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define ll long long
using namespace std;
ll dp[10000000], revdp[10000000], n, k, l;
vector<ll> p;


ll delivery(int N, int K, int L, int P[]) {
    n = N; k = K; l = L;
    for (int i=0;i<n;i++) {
        p.pb(P[i]);
        dp[i] = 0;
        revdp[i] = 0;
    }
    
    
    dp[0] = 0; revdp[0] = 0;
    ll leftlimit = n, rightlimit = n;
    for (int i=0;i<n;i++) {
        if (p[i] >= ceil(l/2)) {
            leftlimit = i;
            break;
        }
        dp[i + 1] = 2 * p[i] + dp[max((ll)0, i + 1 - k)];
    }
    for (int i=0;i<n;i++) {
        if (p[n - i - 1] <= l/2) {
            rightlimit = i;
            break;
        }
        revdp[i + 1] = 2 * (l - p[n - i - 1]) + revdp[max((ll)0, i + 1 - k)];
    }


    ll ans = INT64_MAX;
    ll start, end, count = 0;
    if (l % 2 == 0) {
        for (int i=0;i<n;i++) {
            if (p[i] == l/2) {
                count += 1;
                end = i;
            }
        }
        if (count == 0) {
            ans = min(ans, dp[leftlimit] + revdp[rightlimit]);
            if (leftlimit == 0 || rightlimit == 0) {
                return ans;
            }
            end = leftlimit;
            start = end - 1;
        } else {
            start = end - count + 1;
            if (count % k != 0) count = k * (count / k + 1);
            for (int i=end;i<start+count;i++) {
                ans = min(ans, dp[max((ll)0, i - count + 1)] + revdp[max((ll)0, n - i)] + (count / k) * l);
            }
        }
        count += k;
        for (int i=end;i<start+count;i++) {
            ans = min(ans, dp[max((ll)0, i - count + 1)] + revdp[max((ll)0, n - i)] + (count / k) * l);
        }
    } else {
        end = leftlimit;
        start = end - 1;
        ans = min(ans, dp[leftlimit] + revdp[rightlimit]);
        if (leftlimit == 0 || rightlimit == 0) {
            return ans;
        }
        for (int i=end;i<start+k;i++) {
            ans = min(ans, dp[max((ll)0, i - k + 1)] + revdp[max((ll)0, n - i)] + l);
        }
    }
    //cout << dp[0] << ' '<< dp[1] << ' ' << dp[2] << endl;
    //cout << revdp[0] << ' ' << revdp[1] << endl;


    return ans;
}
#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...