Submission #401898

#TimeUsernameProblemLanguageResultExecution timeMemory
401898faresbasbsSwapping Cities (APIO20_swap)C++14
100 / 100
490 ms44452 KiB
#include <bits/stdc++.h>
#include "swap.h"
using namespace std;
vector<pair<int,pair<int,int>>> edges;
set<pair<int,int>> pars[100001];
int par[100001],deg[100001];
vector<int> group[100001];
bool good[100001];

int find(int curr){
	return curr == par[curr] ? curr : par[curr] = find(par[curr]);
}

void merge(int a , int b , int c){
	int p1 = find(a) , p2 = find(b);
	if((good[p2] && !good[p1]) || group[p1].size() < group[p2].size()){
		swap(a,b),swap(p1,p2);
	}
	int pre = good[p1];
	if(good[p1] || good[p2] || deg[a] > 1 || deg[b] > 1){
		good[p1] = 1;
	}
	if(pre == 0 && good[p1]){
		for(auto i : group[p1]){
			pars[i].insert({c,p1});
		}
	}
	deg[a] += 1 , deg[b] += 1;
	for(auto i : group[p2]){
		if(good[p1]){
			pars[i].insert({c,p1});
		}
		group[p1].push_back(i);
		par[i] = p1;
	}
	group[p2].clear();
}

void init(int N , int M , vector<int> U , vector<int> V , vector<int> W){
	for(int i = 0 ; i < N ; i += 1){
		par[i] = i;
		pars[i].insert({0,i});
		group[i] = {i};
	}
	for(int i = 0 ; i < M ; i += 1){
		edges.push_back({W[i],{U[i],V[i]}});
	}
	sort(edges.begin(),edges.end());
	for(auto i : edges){
		int a = i.second.first , b = i.second.second , c = i.first;
		if(find(a) == find(b)){
			if(!good[find(a)]){
				good[find(a)] = 1;
				for(auto j : group[find(a)]){
					pars[j].insert({c,find(a)});
				}
			}
			continue;
		}
		merge(a,b,c);
	}
}

int getMinimumFuelCapacity(int X , int Y){
	for(auto i : pars[X]){
		for(auto j : pars[Y]){
			if(i.second == j.second){
				return max(i.first,j.first);
			}
		}
	}
	return -1;
}
#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...