이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100 * 1000 + 7;
const ll I = 1000000LL * 1000000LL * 1000000LL;
int lca[20][N], poz[N], czy[N], od[N];
ll dol[3][N], gor[N], nws[20][N], rnws[20][N], odl[N];
vector<pair<int, ll>> kr[N];
pair<int, int> ed[N];
void DFS(int v)
{
od[v] = 1;
int i;
ll aw;
dol[0][v] = I;
dol[1][v] = I;
dol[2][v] = I;
if(czy[v] == 1)
dol[0][v] = 0;
gor[v] = I;
for(i = 0; i < (int)kr[v].size(); ++i)
{
if(od[kr[v][i].first] == 1)
continue;
if(dol[0][v] == dol[0][kr[v][i].first] + kr[v][i].second)
rnws[0][kr[v][i].first] = dol[1][v];
else
rnws[0][kr[v][i].first] = dol[0][v];
poz[kr[v][i].first] = poz[v] + 1;
odl[kr[v][i].first] = odl[v] + kr[v][i].second;
lca[0][kr[v][i].first] = v;
DFS(kr[v][i].first);
aw = dol[0][kr[v][i].first] + kr[v][i].second;
if(aw < dol[0][v])
swap(aw, dol[0][v]);
if(aw < dol[1][v])
swap(aw, dol[1][v]);
if(aw < dol[2][v])
swap(aw, dol[2][v]);
}
}
void DFS2(int v, int o)
{
od[v] = 1;
int i;
if(czy[v] == 1)
gor[v] = 0LL;
nws[0][v] = dol[0][v];
for(i = 0; i < (int)kr[v].size(); ++i)
{
if(od[kr[v][i].first] == 1)
continue;
gor[kr[v][i].first] = gor[v];
if(dol[0][kr[v][i].first] + kr[v][i].second == dol[0][v])
gor[kr[v][i].first] = min(gor[kr[v][i].first], dol[1][v] + kr[v][i].second);
else
gor[kr[v][i].first] = min(gor[kr[v][i].first], dol[0][v] + kr[v][i].second);
DFS2(kr[v][i].first, o);
}
}
void WyLCA(int n)
{
int i, j;
for(j = 1; j <= 18; ++j)
{
for(i = 1; i <= n; ++i)
{
lca[j][i] = lca[j - 1][lca[j - 1][i]];
nws[j][i] = min(nws[j - 1][i], nws[j - 1][lca[j - 1][i]] + odl[i] - odl[lca[j - 1][i]]);
rnws[j][i] = min(rnws[j - 1][lca[j - 1][i]], rnws[j - 1][i] + odl[lca[j - 1][i]] - lca[j][i]);
}
}
}
pair<int, ll> LCA(int a, int b)
{
int i, pa, pb;
if(a == b)
return make_pair(a, dol[0][a]);
pa = a;
pb = b;
ll w1, w2;
w1 = I;
w2 = I;
if(poz[a] > poz[b])
{
for(i = 18; i >= 0; --i)
{
if(poz[lca[i][a]] > poz[b])
{
w1 = min(w1, nws[i][a] + odl[pa] - odl[a]);
a = lca[i][a];
}
}
if(lca[0][a] == b)
{
w1 = min(w1, odl[pa] - odl[b] + dol[0][b]);
}
w1 = min(w1, nws[0][a] + odl[pa] - odl[a]);
a = lca[0][a];
//cout << a << " " << b << "\n";
}
if(poz[b] > poz[a])
{
for(i = 18; i >= 0; --i)
{
if(poz[lca[i][b]] > poz[a])
{
w2 = min(w2 + odl[b] - odl[lca[i][b]], rnws[i][b]);
b = lca[i][b];
}
}
w2 = min(w2 + odl[b] - odl[lca[0][b]], rnws[0][b]);
b = lca[0][b];
}
if(b == pa)
{
return make_pair(b, min(min(w1, w2), gor[a]));
}
if(a == pb)
{
return make_pair(a, min(w1, w2));
}
for(i = 18; i >= 0; --i)
{
if(lca[i][a] != lca[i][b])
{
w2 = min(w2 + odl[b] - odl[lca[i][b]], rnws[i][b]);
b = lca[i][b];
w1 = min(w1, nws[i][a] + odl[pa] - odl[a]);
a = lca[i][a];
}
}
w2 = min(w2 + odl[b] - odl[lca[0][b]], rnws[0][b]);
b = lca[0][b];
w1 = min(w1, nws[0][a] + odl[pa] - odl[a]);
a = lca[0][a];
w2 += (odl[pa] - odl[a]);
w1 = min(w1, gor[a]);
return make_pair(a, min(w1, w2));
}
void Wyw(int s, int n)
{
int i, j;
for(i = 1; i <= n; ++i)
{
for(j = 0; j <= 18; ++j)
{
nws[j][i] = I;
rnws[j][i] = I;
}
}
poz[s] = 0;
odl[s] = 0LL;
lca[0][s] = s;
DFS(s);
for(i = 1; i <= n; ++i)
od[i] = 0;
DFS2(s, s);
}
void Odp(int q)
{
int i, v, x, a, b;
pair<int, ll> w;
for(i = 1; i <= q; ++i)
{
cin >> x >> v;
a = ed[x].first;
b = ed[x].second;
if(poz[a] < poz[b])
w = LCA(v, b);
else
w = LCA(v, a);
//cout << w.first << " " << LCA(v, b).first << "\n";
if(poz[w.first] <= min(poz[a], poz[b]))
{
cout << "escaped\n";
}
else
{
if(w.second >= I)
cout << "oo\n";
else
cout << w.second << "\n";
}
}
}
void Wczytaj(int &n, int &s, int &q)
{
int i, k, a;
ll d;
cin >> n >> k >> q >> s;
for(i = 1; i < n; ++i)
{
cin >> ed[i].first >> ed[i].second >> d;
kr[ed[i].first].push_back(make_pair(ed[i].second, d));
kr[ed[i].second].push_back(make_pair(ed[i].first, d));
}
for(i = 1; i <= k; ++i)
{
cin >> a;
czy[a] = 1;
}
}
void Valley()
{
int n, s, q;
Wczytaj(n, s, q);
Wyw(s, n);
WyLCA(n);
Odp(q);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
Valley();
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... |