Submission #1137890

#TimeUsernameProblemLanguageResultExecution timeMemory
1137890fryingduc기지국 (IOI20_stations)C++20
100 / 100
304 ms592 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#include "stations.h"
#endif

const int maxn = 1005;
vector<int> g[maxn];
int n, k, q;
int tin[maxn], tout[maxn];
int lb[maxn];
int timer;

void pre_dfs(int u, int prev, int depth) {
  if(depth % 2 == 0) lb[u] = timer++;
  for(auto v:g[u]) {
    if(v == prev) continue;
    pre_dfs(v, u, depth + 1);
  }
  if(depth & 1) lb[u] = timer++;
}

vector<int> label(int n, int k, vector<int> adj_u, vector<int> adj_v) {
  for(int i = 0; i < n; ++i) {
    g[i].clear();
  }
  for(int i = 0; i < (int)adj_u.size(); ++i) {
    g[adj_u[i]].push_back(adj_v[i]);
    g[adj_v[i]].push_back(adj_u[i]);
  }
  timer = 0;
  pre_dfs(0, -1, 0);
  
  vector<int> hehe;
  for(int i = 0; i < n; ++i) {
    hehe.push_back(lb[i]);
  }
  
  return hehe;
}

int find_next_station(int s, int t, vector<int> adj) {
//  debug(s, t, adj);
  if(s > adj[0]) {
    if(s < t || t < adj[0]) return adj[0];
    int nxt = 0;
    for(int i = 0; i < (int)adj.size(); ++i) {
      if(adj[i] <= t) {
        nxt = max(nxt, adj[i]);
      }
    }
    return nxt;
  }
  if(s > t || t > adj.back()) return adj.back();
  int nxt = 1e9;
  for(int i = 0; i < (int)adj.size(); ++i) {
    if(adj[i] >= t) {
      nxt = min(nxt, adj[i]);
    }
  }
  return nxt;
}

#ifdef duc_debug
int par[maxn];
void dfs(int u, int prev) {
  for(auto v:g[u]) {
    if(v == prev) continue;
    par[v] = u;
    dfs(v, u);
  }
}

int get_next(int u, int v) {
  par[v] = -1;
  dfs(v, -1);
  
  return par[u];
}

void solve() {
  cin >> n >> k;
  vector<int> au, av;
  for(int i = 1; i < n; ++i) {
    int u, v; cin >> u >> v;
    au.push_back(u);
    av.push_back(v);
  }
  
  vector<int> lab = label(n, k, au, av);
  
  cin >> q;
  while(q--) {
    int u, v; cin >> u >> v;
    vector<int> dark;
    for(auto i:g[u]) {
      dark.push_back(lab[i]);
    }
    
    sort(dark.begin(), dark.end());
    
    int x = find_next_station(lab[u], lab[v], dark);
//    debug(x, get_next(u, v));
    if(x != lab[get_next(u, v)]) {
      assert(0);
    }
  }
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  
  int t; cin >> t;
  while(t--) {
    solve();
  }

  return 0;
}
#endif

/*
1
5 10
0 1 
1 2
1 3
2 4
2
2 0
3 1

1
6 5
0 1
1 2
1 3
0 4
4 5
3
4 0
5 0
4 2
*/
#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...