Submission #552741

#TimeUsernameProblemLanguageResultExecution timeMemory
552741HanksburgerFactories (JOI14_factories)C++17
100 / 100
5134 ms133732 KiB
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
int par[19][500005], depth[500005], mp[500005], cnt, sz;
vector<pair<int, long long> > adj[500005];
priority_queue<pair<long long, int> > pq;
long long dist[500005], d[500005];
bool visited[500005];
vector<int> vec;
int lca(int u, int v)
{
	if (depth[u]>depth[v])
		swap(u, v);
	int cur=depth[v]-depth[u];
	for (int i=18; i>=0; i--)
		if (cur&(1<<i))
			v=par[i][v];
	if (u==v)
		return u;
	for (int i=18; i>=0; i--)
	{
		if (par[i][u]!=par[i][v])
		{
			u=par[i][u];
			v=par[i][v];
		}
	}
	return par[0][u];
}
void dfs(int u, int p, long long dis, int dep)
{
	mp[u]=cnt;
	cnt++;
	par[0][mp[u]]=mp[p];
	dist[mp[u]]=dis;
	depth[mp[u]]=dep;
	for (int i=0; i<adj[u].size(); i++)
	{
		int v=adj[u][i].first;
		long long w=adj[u][i].second;
		if (v!=p)
			dfs(v, u, dis+w, dep+1);
	}
}
void dfs2(int ind)
{
	int u=vec[ind];
	while (cnt<sz && lca(u, vec[cnt])==u)
	{
		int v=vec[cnt];
		long long w=dist[v]-dist[u];
		adj[u].push_back({v, w});
		adj[v].push_back({u, w});
		cnt++;
		dfs2(cnt-1);
	}
}
void Init(int N, int A[], int B[], int D[])
{
	for (int i=0; i<=N-2; i++)
	{
		adj[A[i]].push_back({B[i], D[i]});
		adj[B[i]].push_back({A[i], D[i]});
	}
	dfs(0, 0, 0, 0);
	for (int i=1; i<=18; i++)
		for (int j=0; j<N; j++)
			par[i][j]=par[i-1][par[i-1][j]];
	for (int i=0; i<N; i++)
		adj[i].clear();
}
long long Query(int S, int X[], int T, int Y[])
{
	vec.clear();
	for (int i=0; i<S; i++)
	{
		X[i]=mp[X[i]];
		vec.push_back(X[i]);
	}
	for (int i=0; i<T; i++)
	{
		Y[i]=mp[Y[i]];
		vec.push_back(Y[i]);
	}
	sort(vec.begin(), vec.end());
	for (int i=1; i<S+T; i++)
		vec.push_back(lca(vec[i-1], vec[i]));
	sort(vec.begin(), vec.end());
	vec.resize(unique(vec.begin(), vec.end())-vec.begin());
	sz=vec.size();
	cnt=1;
	dfs2(0);
	for (int i=0; i<sz; i++)
	{
		d[vec[i]]=1e18;
		visited[vec[i]]=0;
	}
	for (int i=0; i<S; i++)
	{
		d[X[i]]=0;
		pq.push({0, X[i]});
	}
	while (!pq.empty())
	{
		int u=pq.top().second;
		pq.pop();
		if (visited[u])
			continue;
		visited[u]=1;
		for (int i=0; i<adj[u].size(); i++)
		{
			int v=adj[u][i].first;
			long long w=adj[u][i].second;
			if (d[v]>d[u]+w)
			{
				d[v]=d[u]+w;
				pq.push({-d[v], v});
			}
		}
	}
	long long ans=1e18;
	for (int i=0; i<T; i++)
		ans=min(ans, d[Y[i]]);
	for (int i=0; i<sz; i++)
		adj[vec[i]].clear();
	return ans;
}

Compilation message (stderr)

factories.cpp: In function 'void dfs(int, int, long long int, int)':
factories.cpp:37:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |  for (int i=0; i<adj[u].size(); i++)
      |                ~^~~~~~~~~~~~~~
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:110:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |   for (int i=0; i<adj[u].size(); i++)
      |                 ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...