Submission #100029

#TimeUsernameProblemLanguageResultExecution timeMemory
100029jamielimRoller Coaster Railroad (IOI16_railroad)C++14
34 / 100
129 ms10752 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){ vector<pair<int,int> > S,T; for(int i=0;i<n;i++){ S.push_back(make_pair(s[i],i)); T.push_back(make_pair(t[i],i)); } sort(S.begin(),S.end()); sort(T.begin(),T.end()); int pos[n]; for(int i=0;i<n;i++){ pos[S[i].second]=i; } for(int i=n-1;i>=0;i--){ if(pos[T[i].second]>=i){ if(s[T[i].second-1]<T[i].first){ return 1; } ///do something with T[i].second-1 }else{ if(s[T[i].second]<T[i].first){ return 1; } ///do something with T[i].second } } return 0; } 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]); } } memset(memo,-1,sizeof(memo)); long long ans=4000000000000000010; 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...