이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//*
#pragma GCC optimize("O2")
//#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,sse,sse2,fma,tune=native")
//*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll ,ll > pii;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll maxn = 1e5 + 100;
const ll mod =1e9+7;
const ld PI = acos((ld)-1);
#define pb push_back
#define endl '\n'
#define dokme(x) cout << x , exit(0)
#define migmig ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define ms(x , y) memset(x , y , sizeof x)
ll pw(ll a, ll b, ll md = mod){ll res = 1;while(b){if(b&1){res=(a*res)%md;}a=(a*a)%md;b>>=1;}return(res);}
int n , q , s , ex;
bool shop[maxn];
pii e[maxn];
ll w[maxn];
int par[maxn][23];
vector < pii > adj[maxn];
int h[maxn];
int l[maxn] , r[maxn] , t = 0;
ll H[maxn];
int ord[maxn];
void dfs(int v){
r[v] = l[v] = ++t;
ord[t] = v;
for (auto uw : adj[v]){
auto u = uw.first;
auto w = uw.second;
if(u!=par[v][0]){
par[u][0] = v;
h[u] = h[v]+1;
H[u] = H[v] + w;
dfs(u);
r[v] = r[u];
}
}
}
int lca(int u , int v){
if(h[u] > h[v]){
swap(u , v);
}
for (int i = 20 ; i >= 0 ; i --){
if(par[v][i] and h[par[v][i]]>=h[u]){
v = par[v][i];
}
}
if(v == u){
return(v);
}
for (int i = 20 ; i >= 0 ; i --){
if(par[v][i] != par[u][i]){
v = par[v][i] , u = par[u][i];
}
}
return(par[v][0]);
}
void init(){
dfs(ex);
for (int j = 1; j <= 20 ; j ++){
for (int i = 1 ; i <= n ; i ++){
par[i][j] = par[par[i][j - 1]][j - 1];
}
}
}
ll dist(int u , int v){
return(H[u] + H[v] - 2*H[lca(u, v)]);
}
ll f[maxn][23];
ll val[maxn][23];
ll mn(ll l , ll r){
ll cur = l;
ll ans = val[l][0];
for(int i = 20 ; i >= 0 ; i --){
if(cur + (1 << i) > r)continue;
ans = min(ans , val[cur][i]);
cur+=(1 << i);
ans = min(ans , val[cur][0]);
}
return(ans);
}
int32_t main(){
migmig;
cin >> n >> s >> q >> ex;
for(int i = 1 ; i < n ; i ++)
cin >> e[i].first >> e[i].second >> w[i],
adj[e[i].first].pb({e[i].second , w[i]}),
adj[e[i].second].pb({e[i].first , w[i]});
for(int i = 0 ; i < s ; i ++){
int x;
cin >> x;
shop[x] = 1;
}
init();
h[0] = -1;
for(int i = 1 ; i <= n ; i ++){
if(shop[i])val[l[i]][0] = H[i];
else val[l[i]][0] = 1e18;
}
for(int j = 0 ; j < 20 ; j ++){
for(int i = 1 ; i <= n ; i ++){
if(i + (1 << j) > n)continue;
val[i][j+1] = min(val[i][j] , val[i + (1 << j)][j]);
}
}
for(int i = 1 ; i <= n ; i ++){
if(mn(l[i] , r[i]) == 1e18)
f[i][0] = 1e18;
else
f[i][0] = mn(l[i] , r[i]) - 2LL*H[i];
}
for(int j = 1 ; j <= 20 ; j ++)
for(int i = 1 ; i <= n ; i ++)
f[i][j] = min(f[i][j-1] ,f[par[i][j-1]][j-1]);
while(q -- ){
int i , V;
cin >> i >> V;
auto u = e[i].first;
auto v = e[i].second;
if(h[u] < h[v])swap(u , v);
if(l[u] <= l[V] and l[V] <= r[u]){
if(f[u][0] == 1e18){
cout << "oo" << endl;
}
else{
int cur = V;
ll ans = 1e18;
for(int i = 20 ; i >= 0 ; i --){
if(h[par[cur][i]] < h[u] )continue;
ans = min(ans , f[cur][i]);
cur = par[cur][i];
ans = min(ans , f[cur][0]);
}
ans = min(ans , f[cur][0]);
cout << ans + H[V] << endl;
}
}
else{
cout << "escaped" << endl;
}
}
return(0);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |