Submission #1242439

#TimeUsernameProblemLanguageResultExecution timeMemory
1242439KindaGoodGamesBoxes with souvenirs (IOI15_boxes)C++20
35 / 100
351 ms31932 KiB
#include "boxes.h"
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>

using namespace std;

const int INF = numeric_limits<int>::max()/2;

map<pii, int> dp;
vector<int> pos;
int n,K,L;

int rec(int l, int r){
    if(dp.count({l,r})) {
        int res = dp[{l,r}];
        return res;
    }
    if(l == 0 && r == 0){
        return 0;
    }
    auto calc = [](int l, int r, int t){
        if(t == 0 && r == 0) return INF;
        if(t == K && l == 0) return INF;
        int cost = 0;
        // edge case, if you don't move, you don't need to the distance of it 
        if(l-1 >= 0 && t > 0){
            cost += 2*pos[l-1];
        }
        if(n-r < n && t < K){
            cost += (2*(L-pos[n-r]));
        }  
        cost = min(cost, L);

        int nl =max(0LL,l-t);
        int nr = max(0LL,r-(K-t));
        return rec(nl,nr) + cost;
    };

    if(l+r <= K){
        return calc(l,r,l);
    } 

    int mi = INF;
    int lo = 0;
    int hi = K-1; 
    while(lo <= hi){
        int mid = (lo+hi)/2;
        
        
        int res1 = calc(l,r,mid);
        int res2 = calc(l,r,mid+1);
        mi = min({mi, res1,res2});

        // still decreasing
        if(res2-res1 <= 0){
            lo = mid+1;
        }else{
            hi = mid-1;
        }
    }
    dp[{l,r}] = mi;
    return mi;
}

long long delivery(int32_t N, int32_t k, int32_t l, int32_t p[]) {
    n = N;
    K = k;
    L = l;
    pos.resize(n);
    for(int i = 0; i < n; i++){
        pos[i] = p[i];
    }
    sort(pos.begin(),pos.end());

    int mi = INF;
    for(int i = 0; i <= n; i++){
        int c = rec(i, n-i);
        mi = min(mi, c);
    }
    return mi;
}
#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...