Submission #1288609

#TimeUsernameProblemLanguageResultExecution timeMemory
1288609Jawad_Akbar_JJ자매 도시 (APIO20_swap)C++20
30 / 100
116 ms42532 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<18;
vector<pair<int,int>> nei[N], nei2[N], Ed;
int Edge[N], Edg[N], Par[N], stp[N][20], Mx[N][20], hei[N], MinTrg[N], seen[N], Sz[N], inf = 1e9 + 7;

void dfs(int u, int p, int id){
	seen[u] = 1;
	hei[u] = hei[p] + 1;
	MinTrg[u] = inf;

	Mx[u][0] = Edg[id];
	for (int i=0;i<17;i++){
		Mx[u][i+1] = max(Mx[u][i], Mx[stp[u][i]][i]);
		stp[u][i+1] = stp[stp[u][i]][i];
	}

	int m1 = inf, m2 = inf, m3 = inf;
	for (auto [i, id2] : nei[u]){
		if (Edg[id2] < m1)
			m3 = m2, m2 = m1, m1 = Edg[id2];
		else if (Edg[id2] < m2)
			m3 = m2, m2 = Edg[id2];
		else
			m3 = min(m3, Edg[id2]);

		if (id == id2)
			continue;
		if (seen[i] == 1 and hei[i] < hei[u]){
			int d = hei[u] - hei[i], vr = u, wei = Edg[id2];
			for (int i=0;i<17;i++){
				if ((1<<i) & d)
					wei = max(wei, Mx[vr][i]), vr = stp[vr][i];
			}
			MinTrg[i] = min(MinTrg[i], wei);
		}
		if (!seen[i])
			dfs(i, u, id2);
	}

	MinTrg[u] = min(MinTrg[u], m3);
}

void dfs1(int u){
	for (auto [i, w] : nei2[u]){
		dfs1(i);
		MinTrg[u] = min(MinTrg[u], max(MinTrg[i], w));
	}
}

void dfs2(int u, int p = 0){
	hei[u] = hei[p] + 1;
	for (auto [i, w] : nei2[u]){
		MinTrg[i] = min(MinTrg[i], max(MinTrg[u], w));
		dfs2(i, u);
	}
}

int root(int v){
	while (Par[v])
		v = Par[v];
	return v;
}

void init(int n, int m, vector<int> u, vector<int> v, vector<int> w){
	for (int i=1;i<=n;i++)
		Sz[i] = 1;
	for (int i=0;i<m;i++){
		u[i]++, v[i]++;
		Edg[i] = w[i];
		nei[u[i]].push_back({v[i], i});
		nei[v[i]].push_back({u[i], i});
		Ed.push_back({w[i], i});
	}

	dfs(1, 0, N-1);

	sort(begin(Ed), end(Ed));

	for (auto [c, i] : Ed){
		int A = root(u[i]), B = root(v[i]);
		if (A == B)
			continue;

		if (Sz[A] < Sz[B])
			swap(A, B);

		Par[B] = A, Sz[A] += Sz[B], Edge[B] = c;
		nei2[A].push_back({B, c});
	}
	dfs1(root(1));
	dfs2(root(1));
}

int getMinimumFuelCapacity(int u, int v){
	u++, v++;
	int ans = min(MinTrg[u], MinTrg[v]);

	if (hei[u] > hei[v])
		swap(u, v);

	while (hei[v] > hei[u])
		ans = max(ans, Edge[v]), v = Par[v];

	while (u != v)
		ans = max(ans, max(Edge[u], Edge[v])), v = Par[v], u = Par[u];

	if (ans == inf)
		ans = -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...