제출 #985485

#제출 시각아이디문제언어결과실행 시간메모리
985485efishel기지국 (IOI20_stations)C++17
100 / 100
641 ms1796 KiB
#include "stations.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;
using vi = vector <int>;

static void dfs (ll u, ll par, ll dep, vi &ans, vector <vll> &adj, ll &timer) {
    if (!(dep&1)) ans[u] = timer++;
    for (ll v : adj[u]) {
        if (v == par) continue;
        dfs(v, u, dep+1, ans, adj, timer);
    }
    if (dep&1) ans[u] += timer++;
}

vi label (int n, int k, vi vu, vi vv) {
    vector <vll> adj(n, vll({}));
    for (ll i = 0; i < n-1; i++) {
        adj[vu[i]].push_back(vv[i]);
        adj[vv[i]].push_back(vu[i]);
    }
    vi ans(n);
    ll timer = 0;
    dfs(0, 0, 0, ans, adj, timer);
    return ans;
}

int find_next_station (int s, int t, vi c) {
    bool isTin = s < c[0];
    if (isTin) { // subtree of s has >= s
        bool isUp = (t < s || (c.size() == 1 ? true : t > c[c.size()-2])) && s != 0; // s==0: s is root
        if (isUp) {
            return c[c.size()-1]; // highest tout -> my par
        } else {
            return *lower_bound(c.begin(), c.end(), t); // first tout above t
        }
    } else { // subtree of s has <= s
        bool isUp = t > s || (c.size() == 1 ? true : t < c[1]);
        if (isUp) {
            return c[0]; // lowest tin -> my par
        } else {
            return *(--upper_bound(c.begin(), c.end(), t)); // tout above t, minus 1 pos
        }
    }
}
#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...