#include "fun.h"
#pragma GCC optimize "O3,unroll-loops"
#pragma GCC target "abm,bmi,bmi2,popcnt,lzcnt,avx,avx2"
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(v) begin(v), end(v)
#define REP(i,o,n) for(int i=o;i<n;i++)
using namespace std;
int centroid(int N){
  int ans=0;
  int vis=N;
  REP(i,1,N){
    int c=attractionsBehind(0, i);
    if(vis >= c && c >= ((N+1)/2))ans=i,vis=c;
  }
  return ans;
}
int mem[100100];
int subtree(vector<int> direct, int center, int i){
  if(find(all(direct),i)!=direct.end())return find(all(direct),i)-direct.begin();
  REP(x,0,direct.size()-1){
    if((hoursRequired(direct[x], i)+1)==mem[i])return x;
  }
  return direct.size()-1;
}
std::vector<int> createFunTour(int N, int Q) {
  int center = centroid(N);
  vector<int> direct;
  vector<deque<pair<int,int>>> vec;
  REP(i,0,N)mem[i]=hoursRequired(center,i);
  REP(i,0,N){
    if(mem[i]==1)direct.pb(i),vec.emplace_back();
  }
  REP(i,0,N){
    if(mem[i])vec[subtree(direct,center,i)].pb({mem[i],i});
  }
  REP(i,0,vec.size()){
    sort(all(vec[i]));
    reverse(all(vec[i]));
  }
  vector<int> ans;
  int lastidx=-1;
  while(vec.size()){
    pair<int,int> mx = {-1,-1};
    REP(i,0,vec.size())if(vec[i].size() && i!=lastidx)mx=max(mx,vec[i][0]);
    REP(i,0,vec.size())if(vec[i].size() && vec[i][0]==mx){lastidx=i;break;}
    if(mx.fi == -1)break;
    vec[lastidx].pop_front();
    ans.pb(mx.se);
    int large=-1;
    int sz=0;
    REP(i,0,vec.size()){
      sz+=vec[i].size();
    }
    REP(i,0,vec.size()){
      if(vec[i].size()*2 == sz)large=i;
    }
    if(vec.size()==3 && large!=-1){
      deque<pair<int,int>> lgx,smx;
      for(auto i:vec[large])lgx.pb(i);
      REP(i,0,3)if(i!=large)for(auto j:vec[i])smx.pb(j);
      sort(all(lgx));reverse(all(lgx));
      sort(all(smx));reverse(all(smx));
      if(lastidx==large)lastidx=0;
      else lastidx=1;
      vec.clear();
      vec.pb(lgx);
      vec.pb(smx);
    }
  }
  ans.pb(center);
  // cerr<<"! ";
  // for(auto i:ans)cerr<<i<<" ";
  // cerr<<endl;
  return ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |