Submission #305648

#TimeUsernameProblemLanguageResultExecution timeMemory
305648jovan_bStations (IOI20_stations)C++17
100 / 100
1161 ms6008 KiB
#include "stations.h"
#include <bits/stdc++.h>

using namespace std;

vector <int> graf[100005];
vector <int> labels;
int in[100005];
int out[100005];

int tajm;

void dfs(int v, int depth, int par){
    in[v] = ++tajm;
    for(auto c : graf[v]){
        if(c != par){
            dfs(c, depth+1, v);
        }
    }
    out[v] = ++tajm;
    if(depth%2){
        labels[v] = out[v];
    }
    else labels[v] = in[v];
}

map <int, int> koji;

std::vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v) {
	labels.clear();
	labels.resize(n);
	for(int i=0; i<n; i++){
        graf[i].clear();
        in[i] = 0;
        out[i] = 0;
	}
	for(int i=0; i<n-1; i++){
        graf[u[i]].push_back(v[i]);
        graf[v[i]].push_back(u[i]);
	}
	dfs(0, 0, -1);
    int tr = -1;
    vector <int> vec;
    for(auto c : labels) vec.push_back(c);
    sort(vec.begin(), vec.end());
    koji.clear();
    for(auto c : vec){
        koji[c] = ++tr;
    }
    for(int i=0; i<n; i++) labels[i] = koji[labels[i]];
	return labels;
}

int find_next_station(int s, int t, std::vector<int> c) {
    if(s < c[0]){
        ///in
        if(s == 0){
            for(auto g : c) if(g >= t) return g;
        }
        int aut = c[c.size()-2];
        if(s <= t && t <= aut){
            for(auto g : c) if(g >= t) return g;
        }
        return c.back();
    }
    /// out
    int iin = c[1];
    if(iin <= t && t <= s){
        for(int j=c.size()-1; j>=1; j--){
            if(c[j] <= t) return c[j];
        }
    }
    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...