제출 #402579

#제출 시각아이디문제언어결과실행 시간메모리
402579faresbasbs즐거운 행로 (APIO20_fun)C++14
0 / 100
6 ms6348 KiB
#include <bits/stdc++.h> #include "fun.h" using namespace std; int n,bad[300001],h[100001]; multiset<int> ms[100001]; void dfs(int curr , int hi){ h[curr] = hi; ms[curr].insert(hi); for(int i = 2*curr+1 ; i <= 2*curr+2 ; i += 1){ if(i >= n){ continue; } dfs(i,hi+1); for(auto j : ms[i]){ ms[curr].insert(j); } } } int solve(int curr){ bad[curr] = 1; int from = -1 , root = curr; while(curr && !bad[(curr-1)/2]){ from = curr; ms[curr].erase(ms[curr].find(h[root])); curr = (curr-1)/2; } ms[curr].erase(ms[curr].find(h[root])); // cout << curr << endl; if(from == -1){ for(int i = 2*curr+1 ; i <= 2*curr+2 ; i += 1){ if(!bad[i]){ from = i; } } }else{ if(from == 2*curr+1){ from += 1; }else{ from -= 1; } } if(bad[from]){ return curr; } curr = from; while(true){ bool g = 0; for(int i = 2*curr+1 ; i <= 2*curr+2 ; i += 1){ if(bad[i]){ continue; } if(*(--ms[i].end()) == *(--ms[curr].end())){ g = 1; curr = i; break; } } if(!g){ break; } } return curr; } vector<int> createFunTour(int N , int Q){ n = N; for(int i = n ; i <= 300000 ; i += 1){ bad[i] = 1; } dfs(0,0); vector<int> ret = {n-1}; for(int i = 0 ; i < n-1 ; i += 1){ ret.push_back(solve(ret.back())); } 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...