This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// #define _GLIBCXX_DEBUG
#include "factories.h"
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pll pair<ll,ll>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;
ll n, Time;
ll tin[500005], tout[500005], dist[500005], dis[500005];
vector <pll> euler;
vector <pll> a[500005];
priority_queue <pll, vector <pll>, greater<pll>> q;
void dfs(ll u, ll pa)
{
tin[u]=euler.size();
euler.pb({dist[u], u});
for (pll ed:a[u])
{
ll v=ed.fi, w=ed.se;
if (v==pa)
continue;
dist[v]=dist[u]+w;
dfs(v, u);
euler.pb({dist[u], u});
}
tout[u]=euler.size()-1;
}
struct Sparse
{
ll n;
vector <ll> lg;
vector <vector <pll>> sp;
void init(ll n)
{
this->n=n;
lg.assign(n+1, 0);
for (ll i=2; i<=n; i++)
lg[i]=lg[i/2]+1;
sp.resize(lg[n]+1);
for (ll i=0; i<=lg[n]; i++)
sp[i].assign(n+1, {0, 0});
for (ll i=0; i<n; i++)
sp[0][i]=euler[i];
for (ll i=1; i<=lg[n]; i++)
for (ll j=0; j+(1<<i)<=n; j++)
sp[i][j]=min(sp[i-1][j], sp[i-1][j+(1<<(i-1))]);
}
ll LCA(ll l, ll r)
{
l=tin[l], r=tin[r];
if (l>r) swap(l, r);
ll j=lg[r-l+1];
return min(sp[j][l], sp[j][r-(1<<j)+1]).se;
}
ll distance(ll u, ll v)
{
ll p=LCA(u, v);
ll ans=dist[u]+dist[v]-dist[p]*2;
return ans;
}
} b;
void Init(int N, int A[], int B[], int C[])
{
n=N;
for (ll i=0; i<n-1; i++)
a[A[i]].pb({B[i], C[i]}), a[B[i]].pb({A[i], C[i]});
dfs(0, 0);
b.init(euler.size());
}
bool cmp(ll a, ll b)
{
return tin[a]<tin[b];
}
ll Query(int S, int X[], int T, int Y[])
{
map <ll, ll> Map;
vector <ll> ver;
vector <vector <pll>> edge;
for (ll i=0; i<S; i++)
ver.pb(X[i]);
for (ll i=0; i<T; i++)
ver.pb(Y[i]);
sort(ver.begin(), ver.end(), cmp);
for (ll i=ver.size()-1; i>=1; i--)
ver.pb(b.LCA(ver[i], ver[i-1]));
sort(ver.begin(), ver.end(), cmp);
ver.resize(unique(ver.begin(), ver.end())-ver.begin());
edge.resize(ver.size());
vector <ll> st;
for (ll i=0; i<ver.size(); i++)
{
dis[i]=-1;
Map[ver[i]]=i;
if (i==0)
{
st.pb(i);
continue;
}
while (tin[ver[st.back()]]>tin[ver[i]] || tout[ver[st.back()]]<tout[ver[i]])
st.pop_back();
edge[i].pb({st.back(), b.distance(ver[i], ver[st.back()])});
edge[st.back()].pb({i, b.distance(ver[i], ver[st.back()])});
st.pb(i);
}
for (ll i=0; i<S; i++)
dis[Map[X[i]]]=0, q.push({0, Map[X[i]]});
while (!q.empty())
{
ll u=q.top().se, disu=q.top().fi; q.pop();
if (dis[u]!=disu)
continue;
for (pll ed:edge[u])
{
ll v=ed.fi, w=ed.se;
if (dis[v]==-1 || dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
q.push({dis[v], v});
}
}
}
ll ans=1e18;
for (ll i=0; i<T; i++)
ans=min(ans, dis[Map[Y[i]]]);
return ans;
}
Compilation message (stderr)
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:106:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
106 | for (ll i=0; i<ver.size(); i++)
| ~^~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |