Submission #965768

#TimeUsernameProblemLanguageResultExecution timeMemory
965768willychanSwapping Cities (APIO20_swap)C++17
100 / 100
174 ms29632 KiB
#include "swap.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct edge{
	int a;
	int b;
	int w;
};
vector<edge> es;
int n;
int m;
vector<vector<int> > side;
vector<int> gtime;
vector<pair<int,int> > p;
vector<bool> cyc;
vector<int> maxd;
vector<vector<int> > ele;
vector<int> deg;
int query(int x){
	while(p[x].first!=x) x=p[x].first;
	return x;
}

void init(int N, int M,std::vector<int> U, std::vector<int> V, std::vector<int> W) {
	n = N;
	m = M;
	side.resize(n);
	gtime.resize(n,-1);
	p.resize(n);
	cyc.resize(n);
	maxd.resize(n);
	ele.resize(n);
	deg.resize(n,0);
	for(int i=0;i<M;i++){
		es.push_back({U[i],V[i],W[i]});
	}
	sort(es.begin(),es.end(),[](const edge &x,const edge &y){return x.w<y.w;});
	for(int i=0;i<n;i++){
		ele[i].push_back(i)	;
		p[i]={i,0};
	}
	for(int i=0;i<m;i++){
		int u = es[i].a;
		int v = es[i].b;
		deg[es[i].a]++;
		deg[es[i].b]++;
		u = query(u);
		v = query(v);
		if(u==v){
			cyc[u]=1;
			maxd[u] = max({maxd[u],deg[es[i].a],deg[es[i].b]});
			if(gtime[u]==-1){
				for(auto e : ele[u]) gtime[e]=es[i].w;
			}
			continue;
		}
		if(ele[u].size()<ele[v].size()) swap(u,v);
		p[v] = {u,es[i].w};
		maxd[u] = max({maxd[u],deg[es[i].a],deg[es[i].b],maxd[v]});
		cyc[u] = cyc[u]|cyc[v];
		if(maxd[u]>2 || cyc[u]){
			if(gtime[u]==-1){
				for(auto e : ele[u]) gtime[e]=es[i].w;
			}
			if(gtime[v]==-1){
				for(auto e : ele[v]) gtime[e]=es[i].w;
			}
		}
		for(auto e : ele[v]) ele[u].push_back(e);
	}
}

int getMinimumFuelCapacity(int X, int Y) {
	int mc=0;	
	int x = X;
	int y = Y;
	while(x!=y){
		if(ele[x].size()<ele[y].size()) swap(x,y);
		mc = max(mc,p[y].second);
		y = p[y].first;
	}
	if(gtime[X]==-1 || gtime[Y]==-1) return -1;
	return max({mc,gtime[X],gtime[Y]});
}
#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...