Submission #364053

#TimeUsernameProblemLanguageResultExecution timeMemory
364053b23vBoxes with souvenirs (IOI15_boxes)C++14
35 / 100
2 ms1260 KiB
#include "boxes.h" #include <iostream> #include <vector> #include <algorithm> #include <set> #include <map> #include <climits> #include <cstring> #include <functional> using namespace std; using ll = long long; using ull = unsigned long long; using vi = vector<int>; using ii = pair<int,int>; using vii = vector<pair<int,int>>; using vb = vector<bool>; template<typename T> using Graph = vector<vector<T>>; ll delivery(int n, int K, int L, int p[]) { ll ans = 0; if(K == 1) { for(int i = 0; i < n; ++i) { ans += 2LL * min(p[i], L - p[i]); } } else if(K == n) { ans = min(1LL * L, 2LL * p[n - 1]); ans = min(ans, 2LL * (L - p[0])); for(int i = 0; i < n - 1; ++i) { ans = min(ans, 2LL * p[i] + 2LL * (L - p[i + 1])); } } else if(n <= 10) { Graph<vector<ll>> dp(1 << n, Graph<ll>(n + 1, vector<ll>(K + 1, -1))); function<ll(int,int,int)> run; run = [&run, n, K, L, p, &dp](int mask, int i, int k) -> ll { // cerr << mask << ' ' << i << ' ' << k << '\n'; ll pos = 0; if(i != n) pos = p[i]; if(mask == 0) { return min(pos, L - pos); } ll& res = dp[mask][i][k]; if(res != -1) return res; res = LONG_MAX; if(k == 0) { return res = min(pos, L - pos) + run(mask, n, K); } int tm = mask; while(tm) { int bit = tm & -tm; int j = __builtin_ctz(bit); ll d = abs(p[j] - pos); d = min(d, (ll)L - d); res = min(res, run(mask - bit, j, k - 1) + d); tm -= bit; } return res; }; int mask = (1 << n) - 1; ans = run(mask, n, K); } 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...