Submission #1331214

#TimeUsernameProblemLanguageResultExecution timeMemory
1331214tsetsenbileg선물상자 (IOI15_boxes)C++20
100 / 100
574 ms252604 KiB
#include "boxes.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
using ll = long long;
using pr = pair<int, int>;
// const int INF = 1e9+7, MOD = 1e9+7;
const ll INF = 1e18;
vector<int> a;
int n, k, l;

struct dstack{
    stack<ll> lnum, lmin, rnum, rmin;
    void insert(ll x) {
        rnum.push(x);
        if (rmin.empty()) rmin.push(x);
        else rmin.push(min(rmin.top(), x));
    }
    void erase() {
        if (lnum.empty()) {
            while (!rnum.empty()) {
                ll num = rnum.top(); 
                rnum.pop(); rmin.pop();
                lnum.push(num); 
                if (lmin.empty()) lmin.push(num);
                else lmin.push(min(lmin.top(), num));
            }
            
        }
        lnum.pop();
        lmin.pop();
    }
    ll value() {
        ll res = INF;
        if (!lmin.empty()) res = min(res, lmin.top());
        if (!rmin.empty()) res = min(res, rmin.top());
        return res;
    }
};

vector<ll> deepee(const vector<int>& a, int s) {
    vector<ll> dp(n+1, INF);
    dp[0] = 0;
    dstack cur;
    cur.insert(0);
    for (int i = 1; i <= n; i++) {
        if (i > k) {
            cur.erase();
        }
        // for (auto j : cur) cout << j.first << ' ';
        // cout << '\n';
        auto mn = cur.value();
        int d = abs(a[i-1]-s) + min(a[i-1], l - a[i-1]);
        dp[i] = mn + d;
        cur.insert(dp[i]);
    }
    return dp;
}

long long delivery(int N, int K, int L, int p[]) {
    n = N; k = K; l = L;
    a.resize(n, 0);
    for (int i = 0; i < n; i++) a[i] = p[i];
    vector<ll> pref = deepee(a, 0);
    reverse(a.begin(), a.end());
    vector<ll> suff = deepee(a, l);
    ll res = INF;
    // res = min(pref[n], suff[n]);
    for (int i = 0; i <= n; i++) {
        res = min(res, pref[i] + suff[n-i]);
    }
    // cout << res;
    return res;
}
#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...