Submission #1281148

#TimeUsernameProblemLanguageResultExecution timeMemory
1281148SonicMLStations (IOI20_stations)C++20
0 / 100
395 ms584 KiB
#include "stations.h"
#include <vector>
#include <iostream>
#include <algorithm>

int const NMAX = 1000;
std::vector <int> g[1 + NMAX];
int depth[1 + NMAX];
bool visit[1 + NMAX];

int ind;
int rank[1 + NMAX];

void DFS(int node) { 
  visit[node] = true;
  if(depth[node] % 2 == 0) {
    rank[node] = ind;
    ind++;
  }
  for(int i = 0;i < g[node].size();i++) {
    int to = g[node][i];
    if(visit[to] == false) {
      depth[to] = depth[node] + 1;
      DFS(to);
    }
  }
  if(depth[node] % 2 == 1) {
    rank[node] = ind;
    ind++;
  }
}

std::vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v) {
  std::vector<int> labels;
  labels.resize(n);
  for(int i = 0;i < n-1;i++) {
    int a = u[i];
    int b = v[i];
    g[a].push_back(b);
    g[b].push_back(a);
  }
  DFS(0);
  for(int i = 0;i < n;i++) {
    labels[i] = rank[i];
  }
  return labels;
}

int find_next_station(int s, int t, std::vector<int> c) {
  // find if s is in or out label "in" if smallest, "out" if biggest
  sort(c.begin(), c.end());
  //std::cerr << "\"" << s << ' ' << t;
  //for(int i = 0;i < c.size();i++) {
  //  std::cerr << ' ' << c[i];
  //}
  //std::cerr << "\"\n";
  if(s < c[0]) {  // s = in  => c = out
    if(s == 0) { // root, no parent
      for(int i = 0;i < c.size();i++) {
	if(c[i]+1 <= t && t <= c[i+1]) {// v[i+1].in = v[i].out+1 c[i] holds out 
          return c[i+1];
        }
      }
      return c[0]; // c[0] remaining child
    }else {
      // parent is biggest in the c = out case -> c[c.size()-1] = parent  
      for(int i = 0;i+1 < c.size();i++) {
        if(c[i]+1 <= t && t <= c[i+1]) { 
          return c[i+1];
        }
      }
      if(s+1 <= t && t <= c[0]) { // v[0].in = s.in+1
        return c[0];
      } 
      return c[c.size()-1];
    }
  } else { // s = out => c = in -> also no root case
    // parent in 0
    for(int i = 1;i < c.size();i++) {
      if(c[i] <= t && t <= c[i+1]-1) { // c[i].out = c[i+1].in-1
        return c[i];
      } 
    }
    if(c[c.size()-1] <= t && t <= s-1) { // 
      return c[c.size()-1];
    }
    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...