제출 #1267402

#제출 시각아이디문제언어결과실행 시간메모리
1267402alvaro_quispeValley (BOI19_valley)C++20
100 / 100
104 ms44844 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ii = pair<int, int>;
using vi = vector<int>;
using vl = vector<ll>;
#define dbg(x) cerr << #x << " = " << (x) << endl;
#define raya cerr << " ==================== " << endl;
#define rep(i, a, b) for (auto i = a; i < (b); ++i)
#define sz(x) (int)(x).size()
#define all(x) begin(x), end(x)

int n, s, q, e, lim = 17;
ll inf = ll(1e16);
using par = pair<int,ll>;
vector<vector<par>> adj;
vector<bool> vis, ist;
vi inp, out, niv;
vl dist, mag;
vector<vector<par>> miele;

void gaaa(int u, int& t, int p, ll d, int lev) {
  inp[u] = t;
  miele[0][u] = {p, 0};
  niv[u] = lev;
  dist[u] = d;
  for(auto& [v, w]: adj[u]) {
    if (inp[v] >= 0) continue;
    gaaa(v, ++t, u, d+w, lev+1);
  }
  out[u] = t++;
}

bool anc(int u, int v) {
  return inp[u] <= inp[v] and out[v] <= out[u];
}

ll magico(int u) {
  vis[u] = 1;
  for(auto& [v,w]: adj[u]) {
    if (vis[v])continue;
    mag[u] = min(mag[u], magico(v) + 2*w);
  }
  if (ist[u]) mag[u] = -dist[u];
  return mag[u];
}

void here() {
  for (auto i = 0; i < n; i++) {
    auto [p, m] = miele[0][i];
    //miele[0][i].second = min(mag[i], mag[p]);
    miele[0][i].second = mag[p];
  }
  for (auto i = 1; i < lim; i++) {
    for (auto j = 0; j < n; j++) {
      miele[i][j] = { miele[i-1][miele[i-1][j].first].first,  
        min(miele[i-1][j].second, miele[i-1][miele[i-1][j].first].second)
      };
    }
  }
}

int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin.exceptions(cin.failbit);
  cin >> n >> s >> q >> e;
  vector<ii> edg(n);
  --e;
  adj.assign(n, vector<par>());
  ist.assign(n,0);
  vis.assign(n,0);
  inp.assign(n, -1);
  out.assign(n, 0);
  niv.assign(n, 0);
  dist.assign(n, 0);
  mag.assign(n, inf);
  miele.assign(lim, vector<par>(n));
  for (auto i = 0; i < n-1; i++) {
    int x,y; ll w; cin >> x >> y >> w;
    --x,--y;
    edg[i]={x,y};
    adj[x].emplace_back(y, w);
    adj[y].emplace_back(x, w);
  }
  for (auto i = 0; i < s; i++) {int x; cin >> x; ist[x-1]=1;}
  int xd = 0;
  gaaa(e, xd, e, 0, 0);
  magico(e);
  here();
  adj.clear();
  for (auto q_ = 0; q_ < q; q_++) {
    int x, y; cin >> x >> y;
    --x, --y;
    int p =(inp[edg[x].first]> inp[edg[x].second])?edg[x].first:edg[x].second;
    if (anc(p, y)) {
      int d = niv[y] - niv[p];
      ll m = mag[y];
      xd = y;
      for (auto i = 0; i < lim; i++) 
        if (d & 1<<i) 
          m = min(m, miele[i][y].second), y = miele[i][y].first;
      if (m == inf) cout << "oo\n";
      else cout << m + dist[xd]<<'\n';
    } else {
      cout << "escaped\n";
    }
  }
  //for(auto& i: mag) cout <<i<<' '; cout << '\n';
  //for(auto& [v,w]: miele[0]) cout << v<<'.'<<w<<' ';cout <<'\n';
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...