70 分 WA 6#7#9# 求调
查看原帖
70 分 WA 6#7#9# 求调
676695
xiehanrui0817楼主2024/7/12 15:45
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;
using ll = long long;

const int MAXN = 5e4 + 5;

struct Edge {
  int u, w;
};

bool v[MAXN];
vector<Edge> g[MAXN];
vector<ll> a[MAXN];
int n, m, k, xx[MAXN], b[MAXN], fa[MAXN][16];
ll st[MAXN][16];

void dfs(int x, int fx) {
  for (int i = 1; i < 16; i++) {
    fa[x][i] = fa[fa[x][i - 1]][i - 1];
    st[x][i] = st[x][i - 1] + st[fa[x][i - 1]][i - 1];
  }
  for (auto e : g[x]) {
    if (e.u != fx) {
      fa[e.u][0] = x, st[e.u][0] = e.w;
      dfs(e.u, x);
    }
  }
}

bool Dfs(int x, int fx) {
  if (v[x]) return 1;
  if (g[x].size() == 1) {
    return 0;
  }
  bool flag = 1;
  for (auto e : g[x]) {
    if (e.u != fx) flag &= Dfs(e.u, x);
  }
  return flag;
}

bool Check(ll ti) {
  for (int i = 1; i <= n; i++) {
    v[i] = 0, a[i].clear();
  }
  for (int i = 1; i <= m; i++) {
    int u = xx[i];
    ll t = ti;
    for (int j = 15; j >= 0; j--) {
      if (st[u][j] <= t && fa[u][j] > 1) {
        t -= st[u][j], u = fa[u][j];
      }
    }
    if (fa[u][0] == 1 && st[u][0] <= ti) {
      a[u].push_back(t);
    } else {
      v[u] = 1;
    }
  }
  vector<pair<ll, int>> p;
  multiset<pair<ll, int>> q;
  for (int i = 1; i <= k; i++) {
    if (Dfs(b[i], 1)) continue;
    p.push_back({st[b[i]][0], b[i]});
  }
  for (int i = 1; i <= k; i++) {
    for (auto t : a[b[i]]) {
      q.insert({t - st[b[i]][0], b[i]});
    }
  }
  for (auto [t, x] : p) {
    auto it = q.lower_bound({t, 0});
    ll tt = 1e14;
    for (auto o : a[x]) {
      if (q.find({o - t , x}) != q.end()) {
        tt = min(o - t, tt);
      }
    }
    if (it == q.end() && tt == 1e14) return 0;
    if (it == q.end() || tt + 2 * t <= it->first) {
      q.erase(q.find({tt, x}));
    } else {
      q.erase(it);
    }
  }
  return 1;
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  for (int i = 1, u, v, w; i < n; i++) {
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }
  for (auto e : g[1]) {
    b[++k] = e.u;
  }
  cin >> m, dfs(1, 0);
  for (int i = 1; i <= m; i++) {
    cin >> xx[i];
  }
  ll l = 1, r = 1e14;
  while (l < r) {
    ll mid = (l + r) >> 1;
    Check(mid) ? r = mid : l = mid + 1;
  }
  cout << (l == 1e14 ? -1ll : l);
  return 0;
}
2024/7/12 15:45
加载中...