Submission #1226006

#TimeUsernameProblemLanguageResultExecution timeMemory
1226006KALARRYFun Tour (APIO20_fun)C++20
10 / 100
219 ms36776 KiB
//chockolateman #include<bits/stdc++.h> #include "fun.h" using namespace std; const int INF = 1e9; int hoursRequired(int X, int Y); int attractionsBehind(int X, int Y); vector<int> adj[100005]; int n,dist[505][505],dp[20][(1<<19)],par[20][(1<<19)]; void dfs(int v,int p,int root) { for(auto u : adj[v]) if(u != p) { dist[root][u] = dist[root][v] + 1; dfs(u,v,root); } } stack<int> ans; void find_path(int i,int mask) { ans.push(i); int j = par[i][mask]; int new_mask = mask ^ (1<<i); if(new_mask == (1<<n) - 1) return; find_path(j,new_mask); } std::vector<int> createFunTour(int N, int Q) { n = N; int H = hoursRequired(0, N - 1); int A = attractionsBehind(0, N - 1); for(int i = 0 ; i < N ; i++) for(int j = i+1 ; j < N ; j++) { if(hoursRequired(i, j) == 1) { adj[i].push_back(j); adj[j].push_back(i); } } for(int i = 0 ; i < N ; i++) dfs(i,i,i); for(int i = 0 ; i < N ; i++) { int mask = ((1<<N) - 1 ) ^ (1<<i); dp[i][mask] = INF; } for(int mask = (1<<N) - 1 ; mask >= 0 ; mask--) for(int i = 0 ; i < N ; i++) { if(mask == (((1<<N) - 1 ) ^ (1<<i))) continue; dp[i][mask] = -1; if(mask & (1<<i)) continue; int new_mask = mask ^ (1<<i); for(int j = 0 ; j < N ; j++) if(!(new_mask & (1<<j))) { if(dist[i][j] <= dp[j][new_mask] && dist[i][j] > dp[i][mask]) { dp[i][mask] = dist[i][j]; par[i][mask] = j; } } } for(int i = 0 ; i < N ; i++) if(dp[i][0] != -1) { find_path(i,0); break; } vector<int> ret; while(!ans.empty()) { ret.push_back(ans.top()); ans.pop(); } return ret; }
#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...