제출 #1072862

#제출 시각아이디문제언어결과실행 시간메모리
1072862thinknoexit즐거운 행로 (APIO20_fun)C++17
21 / 100
369 ms93380 KiB
#include "fun.h"
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 100100;
int n;
set<pair<int, int>> s[N];
bool ch[N];
vector<int> createFunTour(int _N, int Q) {
    n = _N;
    for (int i = n - 1;i >= 0;i--) {
        s[i].insert({ 0, i });
        if (2 * i + 1 < n) {
            for (auto& [d, j] : s[2 * i + 1]) s[i].insert({ d + 1, j });
        }
        if (2 * i + 2 < n) {
            for (auto& [d, j] : s[2 * i + 2]) s[i].insert({ d + 1, j });
        }
    }
    vector<int> res;
    res.push_back(n - 1);
    while ((int)res.size() < n) {
        int now = res.back();
        ch[now] = 1;
        auto x1 = (--s[now].end());
        int d = 0;
        int mx = x1->first, idx = x1->second;
        s[now].erase({ 0, now });
        while (now != 0) {
            int p = (now - 1) / 2;
            if (ch[p]) break;
            s[p].erase({ ++d, res.back() });
            int dis = d, id = 0;
            if (now == 2 * p + 1) {
                if (s[now + 1].empty()) id = p;
                else {
                    auto x = --s[now + 1].end();
                    dis += x->first, id = x->second;
                }
            }
            else {
                if (s[now - 1].empty()) id = p;
                else {
                    auto x = --s[now - 1].end();
                    dis += x->first, id = x->second;
                }
            }
            if (dis > mx) {
                mx = dis;
                idx = id;
            }
            now = p;
        }
        res.push_back(idx);
    }
    return res;
}
#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...