Submission #290559

#TimeUsernameProblemLanguageResultExecution timeMemory
290559LawlietSwapping Cities (APIO20_swap)C++17
100 / 100
295 ms21496 KiB
#include "swap.h"
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 200010;
const int INF = 1000000010;

int n, m;

int w[MAXN];
int ord[MAXN];
int minTime[MAXN];
int anc[MAXN], tW[MAXN], degree[MAXN];

vector<int> nodes[MAXN];

bool cmp(int i, int j) { return w[i] < w[j]; }

int find(int cur)
{
	if( anc[cur] == cur ) return cur;
	return find( anc[cur] );
}

void update(int i, int curW)
{
	if( curW == INF ) return;
	if( minTime[i] != INF ) return;

	for(int k = 0 ; k < (int)nodes[i].size() ; k++)
		minTime[ nodes[i][k] ] = curW;
}

void join(int i, int j, int curW)
{
	degree[i]++; degree[j]++;
	bool flip = ( degree[i] >= 3 || degree[j] >= 3 );

	i = find(i), j = find(j);

	if( i == j ) flip = true;

	if( flip )
	{
		update( i , curW );
		update( j , curW );
	}

	if( i == j ) return;

	bool isSpecial = ( minTime[i] != INF || minTime[j] != INF );

	if( isSpecial )
	{
		update( i , curW );
		update( j , curW );
	}

	if( (int)nodes[i].size() < (int)nodes[j].size() )
		swap( i , j );

	anc[j] = i;
	tW[j] = curW;

	while( !nodes[j].empty() )
	{
		nodes[i].push_back( nodes[j].back() );
		nodes[j].pop_back();
	}
}

void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) 
{
	n = N; m = M;

	for(int i = 0 ; i < n ; i++)
	{
		anc[i] = i;
		nodes[i].push_back( i );

		minTime[i] = tW[i] = INF;
	}

	for(int i = 0 ; i < m ; i++)
		w[i] = W[i];

	iota( ord , ord + m , 0 );
	sort( ord , ord + m , cmp );

	for(int i = 0 ; i < m ; i++)
		join( U[ ord[i] ] , V[ ord[i] ] , W[ ord[i] ] );
}

int getMinimumFuelCapacity(int X, int Y) 
{
	if( minTime[X] == INF ) return -1;

	int ans = minTime[X];

	while( X != Y )
	{
		if( tW[X] > tW[Y] )
			swap( X , Y );

		ans = max( ans , tW[X] );
		X = anc[X];
	}

	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...