제출 #965987

#제출 시각아이디문제언어결과실행 시간메모리
965987Darren0724즐거운 행로 (APIO20_fun)C++17
26 / 100
81 ms21332 KiB
#include "fun.h" #include <bits/stdc++.h> using namespace std; #define all(x) x.begin(),x.end() const int N=200005; int cntid=0; vector<int> adj[N],sz(N,1),pa(N),ans,dis(N); priority_queue<pair<int,int>> pq[3]; void dfs(int k){ for(int j:adj[k]){ if(j==pa[k])continue; pa[j]=k; dfs(j); sz[k]+=sz[j]; } } int cen(int k,int need){ for(int j:adj[k]){ if(j==pa[k])continue; if(sz[j]>=need)return cen(j,need); } return k; } void dfs1(int k,int pa){ pq[cntid].push({dis[k],k}); for(int j:adj[k]){ if(j==pa)continue; dis[j]=dis[k]+1; dfs1(j,k); } } vector<int> createFunTour(int n, int q) { //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); } } } dfs(0); int c1=cen(0,(n+1)/2); for(int j:adj[c1]){ dfs1(j,c1); cntid++; } int last=-1; for(int i=1;i<n;i++){ pair<int,int> p={-1,-1}; for(int j=0;j<cntid;j++){ if(j==last||pq[j].size()==0)continue; p=max(p,make_pair(pq[j].top().first,j)); } last=p.second; auto [dis1,idx]=pq[p.second].top(); pq[p.second].pop(); ans.push_back(idx); } ans.push_back(c1); /*for(int j:ans){ cout<<j<<' '; } cout<<endl;*/ 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...
#Verdict Execution timeMemoryGrader output
Fetching results...