제출 #1242439

#제출 시각아이디문제언어결과실행 시간메모리
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...