제출 #1364956

#제출 시각아이디문제언어결과실행 시간메모리
1364956backer8002기지국 (IOI20_stations)C++20
100 / 100
290 ms524 KiB
#include <assert.h>
#include <bits/stdc++.h>
using namespace std;

vector<int> label(int n, int, vector<int> u, vector<int> v) {
    vector<vector<int> > edges(n);
    for (int i = 0; i < n - 1; i++) {
        edges[u[i]].emplace_back(v[i]);
        edges[v[i]].emplace_back(u[i]);
    }
    vector<int> res(n);
    stack<tuple<int,int,bool,bool>> st;
    st.emplace(0,0,false,false);
    int time = 0;
    while (st.size()) {
        auto [cur,prev,m,re] = st.top();
        st.pop();
        if (!m)
            res[cur] = time++;
        else {
            if (re) {
                res[cur] = time++;
                continue;
            }
            st.emplace(cur,prev,m,true);
        }
        for (int edge : edges[cur]) if (edge != prev) st.emplace(edge,cur,!m,false);
    }
    return res;
}

int find_next_station(int s, int t, vector<int> c) {
    if (s < c[0]) {
        if (t >= c.back() || t < s)
            return c.back();
        return *ranges::lower_bound(c, t);
    }
    if (t > s || t <= c[0])
        return c[0];
    int lo=0,hi=c.size();
    while (hi-lo > 1) {
        int mid = (lo+hi)/2;
        if (c[mid] > t)
            hi = mid;
        else
            lo = mid;
    }
    if (hi != c.size() and c[hi] <= t)
        return c[hi];
    return c[lo];
}

#if 0

int main() {
    int n;
    cin >> n;
    vector<int> edge1(n), edge2(n);

    for (int i = 0; i < n - 1; i++) {
        cin >> edge1[i] >> edge2[i];
    }

    auto labels = label(n, 0, edge1, edge2);

    map<int, int> mapping;
    for (int i = 0; i < n; i++)
        mapping[labels[i]] = i;

    assert(mapping.size() == n);

    for (auto [map,mapped]: mapping)
        println("{}, {}", map, mapped);
    int i,j;
    cin >> i >> j;
    int currentIndex = i;
    while (currentIndex != j) {
        vector<int> values;
        if (mapping[currentIndex] != 0)
            values.emplace_back(labels[mapping[currentIndex] - 1]);
        if (mapping[currentIndex] != n - 1)
            values.emplace_back(labels[mapping[currentIndex] + 1]);
        ranges::sort(values);
        currentIndex = find_next_station(currentIndex, j, values);
        cout << currentIndex << '\n';
    }
}

#endif
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…