Submission #1246786

#TimeUsernameProblemLanguageResultExecution timeMemory
1246786qwushaStations (IOI20_stations)C++20
100 / 100
308 ms672 KiB

#include "stations.h"

#include <iostream>
#include <bits/stdc++.h>

#define fi first
#define se second

using namespace std;

int inf = 1e9 + 7;

vector<vector<int>> g;

vector<int> tin, tout;
int curt = 0;

vector<int> de;

void dfs(int v, int p = -1, int d = 0) {
    de[v] = d;
    tin[v] = curt;
    curt++;
    for (auto u : g[v]) {
        if (u != p) {
            dfs(u, v, d + 1);
        }
    }
    tout[v] = curt;
    curt++;
}

vector<int> label(int n, int k, vector<int> v, vector<int> u) {
    curt = 0;
    vector<int> res(n);
    g.assign(n, {});
    tin.assign(n, -1);
    de.assign(n, 0);
    tout.assign(n, -1);
    for (int i = 0; i < n - 1; i++) {
        g[v[i]].push_back(u[i]);
        g[u[i]].push_back(v[i]);
    }
    dfs(0);
    for (int i = 0; i < n; i++) {
        if (de[i] % 2 == 0) {
            res[i] = tin[i];
        } else {
            res[i] = tout[i];
        }
    }
    set<int> st;
    for (auto el: res){
        st.insert(el);
    }
    map<int, int> mp;
    int ind = 0;
    for (auto el : st) {
        mp[el] = ind;
        ind++;
    }
    for (int i = 0; i < n; i++) {
        res[i] = mp[res[i]];
    }
    return res;
}


int find_next_station(int s, int t, vector<int> c) {
    int p = -1;
    bool is_tin = 1;
    for (auto el : c) {
        if (el < s) {
            is_tin = 0;
        }
    }
    if (s == 0) {
        sort(c.rbegin(), c.rend());
        int ind = 0;
        while (ind < c.size() - 1 && c[ind + 1] >= t) {
            ind++;
        }
        return c[ind];
    }
    if (is_tin) {
        p = -1;
        for (auto el : c) {
            p = max(p, el);
        }
        if (t >= p || t <= s) {
            return p;
        }
        sort(c.rbegin(), c.rend());
        int ind = 1;
        while (ind < c.size() - 1 && c[ind + 1] >= t) {
            ind++;
        }

        if (ind < c.size() && c[ind] >= t)
            return c[ind];
        else
            return p;
    } else {
        p = inf;
        for (auto el : c) {
            p = min(p, el);
        }
        if (t <= p || t >= s) {
            return p;
        }
        sort(c.begin(), c.end());
        int ind = 1;
        while (ind < c.size() - 1 && c[ind + 1] <= t) {
            ind++;
        }
        if (ind < c.size() && c[ind] <= t)
            return c[ind];
        else
            return p;
    }
}

/*
signed main() {
    int n;
    cin >> n;
    vector<int> v(n - 1), u(n - 1);
    for (int i = 0; i < n - 1; i++) {
        cin >> v[i] >> u[i];
    }
    auto res = label(n,1000,v, u);
    for (auto el : res ) {
        cout << el << ' ';
    }
    cout << endl;
    for (int i = 0; i < 1000; i++) {
        int vq, uq;
        cin >> vq >> uq;
        int m;
        cin >> m;
        vector<int> c(m);
        for (int j = 0; j < m; j++) {
            cin >> c[j];
        }
        cout << find_next_station(vq, uq, c) << endl;
    }

}

*/


#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...