제출 #983149

#제출 시각아이디문제언어결과실행 시간메모리
983149vjudge1사이버랜드 (APIO23_cyberland)C++17
21 / 100
3109 ms1065784 KiB
#include <bits/stdc++.h>
using namespace std;

const long long NMAX = 1e5 + 5;
vector<pair<long long,long long> > g[NMAX];
vector<long long> dis(NMAX);
vector<vector<long long> > up(20, vector<long long>(NMAX));
vector<long long> ary(NMAX), tin(NMAX), tout(NMAX);
long long ans, goal, timer;

void precalc(long long v, long long p){
	tin[v] = ++timer;
	up[0][v] = p;
	for(long long i = 1; i < 20; i++){
		up[i][v] = up[i - 1][up[i - 1][v]];
	}
	for(auto [to, cost] : g[v]){
		if(to != p){
			dis[to] = dis[v] + cost;
			precalc(to, v);
		}
	}
	tout[v] = ++timer;	
}

bool upper (long long a, long long b) {
	return tin[a] <= tin[b] && tout[a] >= tout[b];
}

long long lca (long long a, long long b) {
	if (upper (a, b))  return a;
	if (upper (b, a))  return b;
	for (long long i=19; i>=0; --i)
		if (! upper (up[i][a], b))
			a = up[i][a];
	return up[0][a];
}

long long dist(long long a, long long b){
	return dis[a] + dis[b] - dis[lca(a, b)] * 2;
}

void dfs(long long v, long long p){
	if(v == goal) return;
	if(ary[v] == 0){
		ans = min(ans, dist(v, goal));
	}
	for(auto [to, cost] : g[v]){
		if(to != p) dfs(to, v);
	}
}

double solve(int n, int m, int k, int h, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr) {
	for(long long i = 1; i <= n; i++){
		g[i].clear();
		dis[i] = 0;
		for(long long j = 0; j < 20; j++) up[j][i] = 0;
		tin[i] = 0;
		tout[i] = 0;
		timer = 0;
	}
	
	goal = h + 1;
    for(long long i = 0; i < m; i++){
		g[x[i] + 1].push_back({y[i] + 1, c[i]});
		g[y[i] + 1].push_back({x[i] + 1, c[i]});
	}
	for(long long i = 0; i < n; i++){
		ary[i + 1] = arr[i];
	}
	precalc(1, 1);
	ans = dist(1, goal);
	dfs(1, -1);
	
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...