제출 #1214124

#제출 시각아이디문제언어결과실행 시간메모리
1214124loom즐거운 행로 (APIO20_fun)C++20
21 / 100
633 ms170564 KiB
#include "fun.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 5e18
#define nl '\n'

const int N = 1e5;
int p[N];
vector<int> g[N];
map<int,int> dist[N];
set<pair<int,int>> st[N];

void dfs(int v){
   st[v].insert({0, v});

   for(int ch : g[v]){
      dfs(ch);
      for(auto &[d, u] : st[ch]) st[v].insert({d+1, u}), dist[v][u] = d+1; 
   }
}

vector<int> createFunTour(int n, int q){
   p[0] = -1;
   for(int i=1; i<n; i++){
      int x = (i-1)/2;
      g[x].push_back(i);
      p[i] = x;
   }

   dfs(0);
   int x = 0;
   vector<int> ans;

   for(int i=0; i<n; i++){
      int v = x, pre = -1;
      pair<int,int> pr = {-1, -1};

      int d = 1;
      while(v != -1){
         pr = max(pr, {d-1, v});

         for(int ch : g[v]){
            if(ch == pre or st[ch].empty()) continue;
            auto [mx, u] = *st[ch].rbegin();
            pr = max(pr, {mx + d, u});
         }

         pre = v;
         v = p[v];
         d++;
      }

      auto [mx, u] = pr;
      ans.push_back(u);
      x = u;

      v = u;
      while(v != -1){
         st[v].erase({dist[v][u], u});
         v = p[v];
         d++;
      }
   }

   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...