Submission #109308

#TimeUsernameProblemLanguageResultExecution timeMemory
109308DiuvenFactories (JOI14_factories)C++14
100 / 100
5228 ms143736 KiB
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long lint;
typedef pair<int, lint> pil;
typedef vector<int> Vint;
typedef vector<pil> Vpil;

const lint LNF = 2e18;
const int MAX = 5e5 + 10;
const int LG = 19;

int nu[MAX], ri[MAX], iv[MAX], dep[MAX], n;
int st[MAX][LG];
lint D[MAX];
vector<pil> G[MAX];

void dfs1(int v, int p, int cnt=0, lint sum=0){
	static int now = 0;
	nu[v] = ++now, ri[v] = nu[v], iv[nu[v]] = v;
	dep[v] = cnt, D[v] = sum;
	for(pil e:G[v]){
		int x; lint c; tie(x,c) = e;
		if(x==p) continue;
		st[x][0] = v;
		for(int i=1; i<LG; i++)
			st[x][i] = st[st[x][i-1]][i-1];
		dfs1(x,v,cnt+1,sum+c);
		ri[v] = ri[x];
	}
}

void Init(int N, int A[], int B[], int D[]) {
	n = N;
	for(int i=0; i<n-1; i++){
		int u = A[i], v = B[i], c = D[i];
		G[u].push_back({v,c});
		G[v].push_back({u,c});
	}
	dfs1(0,-1);
//	for(int i=0; i<n; i++) cout<<nu[i]<<' '<<ri[i]<<'\n';
}

int lca(int u, int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=LG-1; i>=0; i--)
		if(dep[u]-(1<<i)>=dep[v]) u = st[u][i];
	if(u==v) return u;
	for(int i=LG-1; i>=0; i--)
		if(st[u][i]!=st[v][i])
			u = st[u][i], v = st[v][i];
	return st[u][0];
}

int C[MAX];
lint A[MAX], B[MAX];
Vint V;

int idx;
lint dfs2(){
	int v = V[idx++];
	lint &a = A[v], &b = B[v], res = LNF;
	a = (C[v]==1 ? 0 : LNF);
	b = (C[v]==2 ? 0 : LNF);


	while(idx<int(V.size()) && V[idx]<=ri[iv[v]]){
		int x = V[idx];
		res = min(res, dfs2());
		a = min(a, D[iv[x]]-D[iv[v]] + A[x]);
		b = min(b, D[iv[x]]-D[iv[v]] + B[x]);
	}

	C[v] = 0, res = min(res, a+b);
	return res;
}


lint Query(int S, int X[], int T, int Y[]) {
	Vint P, Q; V.clear();
	for(int i=0; i<S; i++) P.push_back(nu[X[i]]);
	for(int i=0; i<T; i++) Q.push_back(nu[Y[i]]);

	for(int x:P) V.push_back(x), C[x] = 1;
	for(int x:Q) V.push_back(x), C[x] = 2;

	sort(V.begin(), V.end());

	for(int i=1, sz = int(V.size()); i<sz; i++)
		V.push_back(nu[lca(iv[V[i-1]], iv[V[i]])]);

	sort(V.begin(), V.end());
	V.resize(unique(V.begin(), V.end()) - V.begin());

	idx = 0;
	return dfs2();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...