Submission #1025063

#TimeUsernameProblemLanguageResultExecution timeMemory
1025063slivajanRoller Coaster Railroad (IOI16_railroad)C++17
11 / 100
2098 ms7248 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; typedef long long un; typedef vector<un> vuc; #define REP(i, a, b) for(un i = (un)a; i < (un)b; i++) #define FEAC(i, a) for (auto&& i : a) #define vec vector #define ALL(x) (x).begin(), (x).end() constexpr un INF = INT64_MAX; un compute(vec<int> s, vec<int> t, vuc perm){ un ret = 0; REP(i, 0, perm.size()-1){ ret += max(0, t[perm[i]] - s[perm[i+1]]); } return ret; } un easy(std::vector<int> s, std::vector<int> t, un N){ vuc perm(N); iota(ALL(perm), 0); un ret = INF; do{ ret = min(ret, compute(s, t, perm)); } while(next_permutation(ALL(perm))); return ret; } vuc compute_ends(std::vector<int> s, std::vector<int> t, vuc toUse, un N){ vuc tab(N, -1); REP(i, 0, toUse.size()){ tab[toUse[i]] = i; } sort(ALL(toUse)); vuc ret(toUse.size(), INF); do{ ret[tab[toUse[toUse.size()-1]]] = min(ret[tab[toUse[toUse.size()-1]]], compute(s, t, toUse)); } while(next_permutation(ALL(toUse))); return ret; } vuc compute_starts(std::vector<int> s, std::vector<int> t, vuc toUse, un N){ vuc tab(N, -1); REP(i, 0, toUse.size()){ tab[toUse[i]] = i; } sort(ALL(toUse)); vuc ret(toUse.size(), INF); do{ ret[tab[toUse[0]]] = min(ret[tab[toUse[0]]], compute(s, t, toUse)); } while(next_permutation(ALL(toUse))); return ret; } un meet_in_mid(std::vector<int> s, std::vector<int> t, un N){ un ret = INF; vuc A; vuc B; REP(i, 0, 1<<N){ if (__builtin_popcountll(i) != (N/2)) continue; REP(j, 0, N){ if (i & (1 << j)) A.push_back(j); else B.push_back(j); } vuc A_ret = compute_ends(s, t, A, N); vuc B_ret = compute_starts(s, t, B, N); REP(x, 0, A.size()) REP(y, 0, B.size()) { ret = min(ret, A_ret[x] + B_ret[y] + max(0, t[A[x]] - s[B[y]])); } A.clear(); B.clear(); } return ret; } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { un N = (un) s.size(); // if (N <= 8) return easy(s, t, N); if (N <= 16) return meet_in_mid(s, t, N); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...