제출 #1353524

#제출 시각아이디문제언어결과실행 시간메모리
1353524toast12기지국 (IOI20_stations)C++20
5 / 100
297 ms648 KiB
#include "stations.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> adj;
vector<int> in, out;
vector<int> depth;

int tme = 0;

void dfs(int cur, int p) {
    depth[cur] = depth[p]+1;
    in[cur] = tme;
    for (auto e : adj[cur]) {
        if (e != p) {
            tme++;
            dfs(e, cur);
        }
    }
    tme++;
    out[cur] = tme;
}

vector<int> label(int n, int k, vector<int> u, vector<int> v) {
	vector<int> labels(n);
    adj.resize(n);
    for (int i = 0; i < n-1; i++) {
        adj[u[i]].push_back(v[i]);
        adj[v[i]].push_back(u[i]);
    }
    depth.resize(n);
    in.resize(n);
    out.resize(n);
    dfs(0, 0);
    set<int> s;
    for (int i = 0; i < n; i++) {
        if (depth[i] % 2 == 0) labels[i] = out[i];
        else labels[i] = in[i];
        s.insert(labels[i]);
    }
    int cur = 0;
    map<int, int> m;
    for (auto x : s) m[x] = cur++;
    for (int i = 0; i < n; i++) labels[i] = m[labels[i]];
    adj.clear();
    in.clear();
    out.clear();
    depth.clear();
    tme = 0;
    return labels;
}

int find_next_station(int s, int t, vector<int> c) {
	if (c.size() == 1) return c[0];
    if (s < c[0]) { // in time
        if (t >= s && t <= c[c.size()-2]) {
            auto it = upper_bound(c.begin(), c.end(), t);
            if (it != c.begin()) --it;
            return *it;
        }
        return c.back();
    }
    else { // out time
        if (t >= c[1] && t <= s) {
            auto it = upper_bound(c.begin(), c.end(), t);
            if (it != c.begin()) --it;
            return *it;
        }
        return c[0];
    }
}
#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...