Submission #99986

#TimeUsernameProblemLanguageResultExecution timeMemory
99986jamielimRoller Coaster Railroad (IOI16_railroad)C++14
0 / 100
2041 ms12872 KiB
#include <bits/stdc++.h> #include "railroad.h" using namespace std; long long adj[20][20]; long long memo[20][66000]; long long tsp(int x,int bm){ if(memo[x][bm]!=-1)return memo[x][bm]; if(bm==0)return memo[x][bm]=0; long long ans=1000000000000000010; int bm2=bm; while(bm2&(-bm2)){ int y=__builtin_ctz(bm2); ans=min(ans,tsp(y,bm-(bm2&(-bm2)))+adj[x][y]); bm2-=(bm2&(-bm2)); } return memo[x][bm]=ans; } long long plan_roller_coaster(vector<int> s, vector<int> t) { int n=(int)s.size(); if(n>16){ set<pair<int,int> > st; for(int i=0;i<n;i++)st.insert(make_pair(s[i],t[i])); int cur=1; while(!st.empty()){ set<pair<int,int> >::iterator it=st.lower_bound(make_pair(cur,-1)); if(it==st.end())return 0; cur=it->second; --it; } return 1; } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i==j)adj[i][j]=0; else adj[i][j]=max(0,t[i]-s[j]); } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ for(int k=0;k<n;k++){ adj[j][k]=min(adj[j][k],adj[j][i]+adj[i][k]); } } } memset(memo,-1,sizeof(memo)); long long ans=1000000000000000010; for(int i=0;i<n;i++){ ans=min(ans,tsp(i,(1<<n)-1-(1<<i))); } 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...