Submission #99984

#TimeUsernameProblemLanguageResultExecution timeMemory
99984tqbfjotldRoller Coaster Railroad (IOI16_railroad)C++14
11 / 100
2062 ms276448 KiB
#include "railroad.h" #include <bits/stdc++.h> using namespace std; vector<int> s_; vector<int> t_; long long mem[17][1000000]; long long recurse(int cur, int bitmask){ if (bitmask==0) return 0; if (mem[cur][bitmask]!=-1) return mem[cur][bitmask]; int original = bitmask; long long ans = 999999999999999; for (int x = 0; ; x++){ if (bitmask==0) break; if ((bitmask&(1<<x))!=0){ ans = min(ans,recurse(x,original-(1<<x))+((t_[cur]>s_[x])?(t_[cur]-s_[x]):0)); bitmask-=(1<<x); } } return mem[cur][bitmask] = ans; } long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) { int n = (int) s.size(); if (n<=8){ vector<int> v; for (int x = 0; x<n; x++){ v.push_back(x); } long long ans = 999999999999999; long long curans = 0; for (int x = 1; x<n; x++){ curans+=(t[x-1]>s[x])?(t[x-1]-s[x]):0; } ans = min(curans,ans); while (next_permutation(v.begin(),v.end())){ long long curans = 0; for (int x = 1; x<n; x++){ curans+=(t[v[x-1]]>s[v[x]])?(t[v[x-1]]-s[v[x]]):0; } ans = min(curans,ans); } return ans; } else{ memset(mem,-1,sizeof(mem)); for (int x = 0; x<n; x++){ s_.push_back(s[x]); t_.push_back(t[x]); } long long ans = 999999999999999; for (int x = 0; x<n; x++){ ans = min(ans,recurse(x,(1<<n)-1-(1<<x))); } return ans; } 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...