제출 #1361199

#제출 시각아이디문제언어결과실행 시간메모리
1361199retarde통행료 (IOI18_highway)C++20
51 / 100
199 ms24936 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;

int n, m;
map<pair<int, int>, int> id;
vector<int> par, d; vector<vector<int>> adj; vector<pair<int, int>> edges;
long long base = 0;

void dfs(int node, int prev, int dp) {
  if (node < 0 || node >= n) return;
  par[node] = prev;
  d[node] = dp;
  for (auto &neighbour : adj[node]) {
    if (neighbour == prev) continue;
    dfs(neighbour, node, dp + 1);
  }
}

void buildpar(int root) {
  par.resize(n); d.resize(n);
  dfs(root, -1, 0);
}

int ch(int x, int y) {
  if (par[x] == y) return x;
  else return y;
}

int findlow() {
  vector<int> edgeorder;
  vector<int> childs(n); for (int i = 0; i < n; i++) {
    if (par[i] != -1) childs[par[i]]++;
  }
  set<pair<int, int>> lf; for (int i = 0; i < n; i++) if (!childs[i]) lf.insert({-d[i], i});
  while (lf.size()) {
    int cur = (*lf.begin()).second;
    lf.erase(lf.begin());
    if (par[cur] == -1) break;
    edgeorder.push_back(id[{cur, par[cur]}]);
    childs[par[cur]]--;
    if (!childs[par[cur]]) lf.insert({-d[par[cur]], par[cur]});
  }

  int lo = -1, hi = n-1;
  while (hi > lo + 1) {
    int mid = (lo + hi) / 2;
    vector<int> w(n - 1); for (int j = 0; j <= mid; j++) w[edgeorder[j]] = 1;
    long long q = ask(w);
    if (q > base) hi = mid;
    else lo = mid;
  }
  return ch(edges[edgeorder[hi]].first, edges[edgeorder[hi]].second);
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
  int M = U.size(); assert(M == N - 1);
  n = N; m = M; adj.resize(n);
  base = ask(vector<int>(M));
  for (int i = 0; i < M; i++) {
    adj[U[i]].push_back(V[i]);
    adj[V[i]].push_back(U[i]);
    edges.push_back({U[i], V[i]});
    id[{U[i], V[i]}] = i;
    id[{V[i], U[i]}] = i;
  }

  buildpar(0); int x = findlow();
  buildpar(x); int y = findlow();
  answer(x, y);
}

/*
14 13 27 95 7 4
0 1
0 2
0 3
3 4
4 10
4 11
4 12
4 13
3 5
5 6
6 7
7 8
7 9
*/
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…