Submission #1244741

#TimeUsernameProblemLanguageResultExecution timeMemory
1244741BoasHighway Tolls (IOI18_highway)C++20
12 / 100
320 ms327680 KiB
#include "highway.h"

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back
#define sz(x) (int)x.size()
#define ALL(x) begin(x), end(x)
#define loop(n, i) for (int i = 0; i < n; i++)

typedef signed i32;
typedef long long i64;
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<i32> vi32;
typedef vector<vi32> vvi32;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;

void find_pair(i32 N, vi32 U, vi32 V, i32 A, i32 B)
{
  vvii adj(N);
  int M = sz(U);
  loop(M, i)
  {
    adj[U[i]].pb({V[i], i});
    adj[V[i]].pb({U[i], i});
  }
  int disST = ask(vi32(M, 0)) / A;
  vi dis(N);
  vii cand;
  auto dfs = [&](auto &&self, int i, int prev) -> void
  {
    for (auto [j, ix] : adj[i])
      if (j != prev)
      {
        dis[j] = dis[i] + 1;
        if (dis[j] == disST)
          cand.pb({j, ix});
        self(self, j, i);
      }
  };
  dfs(dfs, 0, 0);
  int lo = 0, hi = sz(cand);
  while (hi > lo)
  {
    int m = (lo + hi) / 2;
    vi32 q(M);
    for (int i = 0; i <= m; i++)
      q[cand[i].second] = 1;
    if (ask(q) > disST * (i64)A)
      hi = m;
    else
      lo = m + 1;
  }
  answer(0, cand[lo].first);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...