Submission #1176490

#TimeUsernameProblemLanguageResultExecution timeMemory
1176490tkm_algorithmsSwapping Cities (APIO20_swap)C++20
100 / 100
251 ms70980 KiB
/**
*    In the name of Allah
*    We are nothing and you're everything
**/
#include <bits/stdc++.h>
#include "swap.h"
using namespace std;
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
//#define int ll
const char nl = '\n';
const int N = 3e5+10;
const int inf = 1e9;

int p[N+1], sw[N+1], deg[N+1], we[N+1], dep[N+1];
int par[N+1][30];
vector<int> taze[N+1];
vector<pair<int, pair<int, int>>> g;

int get(int u) {
	if (p[u] != u)return p[u] = get(p[u]);
	return u;
}

void build(int u, int pr) {
	par[u][0] = pr;
	//if (u == 4)cout << pr << nl;
	for (int i = 1; i < 30; ++i) {
		if ((1 << i) > dep[u])break;
		par[u][i] = par[par[u][i-1]][i-1];
	}
	
	for (auto i: taze[u]) {
		if (i == pr)continue;
		dep[i] = dep[u] + 1;
		build(i, u);
	}
}

int lca(int u, int v) {
	if (dep[u] < dep[v])swap(u, v);
	
	for (int i = 29; i >= 0; --i) {
		if (par[u][i] == -1)continue;
		if (dep[par[u][i]] >= dep[v])u = par[u][i]; 
	}
	
	//cout << u << " " << v << nl;
	
	if (u == v)return u;
	
	for (int i = 29; i >= 0; --i)
		if (par[u][i] != par[v][i]) {
			u = par[u][i], v = par[v][i];
		}
	
	return par[u][0];
}

void init(int n, int m, vector<int> ue, vector<int> ve, vector<int> wee) {
	memset(par, -1, sizeof par);
	for (int i = 0; i < m; ++i) {
		g.push_back({wee[i], {ue[i], ve[i]}});
	}
	
	for (int i = 0; i <= N; ++i)
		p[i] = i, sw[i] = 0, deg[i] = 0;
		
	int add = n;
	sort(all(g));
	for (auto i: g) {
		int w, u, v;
		w = i.first, u = i.second.first, v = i.second.second;
		
		int gt1 = get(u), gt2 = get(v);
		p[gt1] = p[gt2] = add;
		add += 1;
		
		//cout << w << nl;
		
		if (gt1 == gt2) {// cycle
			sw[add-1] = 1, we[add-1] = w;
			taze[add-1].push_back(gt1);
		} else {
			
			taze[add-1].push_back(gt1);
			taze[add-1].push_back(gt2);
			deg[u] += 1, deg[v] += 1;
			if (max(deg[u], deg[v]) >= 3 || max(sw[gt1], sw[gt2]) == 1)sw[add-1] = 1;
			we[add-1] = w; 
			
		}
	}
	
	build(add-1, 0);
}

int getMinimumFuelCapacity(int u, int v) {
	int l = lca(u, v);
	if (sw[l] == 1)return we[l];
	for (int i = 29; i >= 0; --i) {
		if (par[l][i] == -1)continue;
		if (sw[par[l][i]] != 1)l = par[l][i];
	}
	
	l = par[l][0];
	if (l == -1 || sw[l] == 0)return -1;
	return we[l];
}
#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...