Submission #338618

#TimeUsernameProblemLanguageResultExecution timeMemory
338618nandonathanielSwapping Cities (APIO20_swap)C++14
100 / 100
502 ms60892 KiB
#include "swap.h"
#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
const int MAXN=100005,MAXM=200005,LOG=19;
typedef pair<int,int> pii;
typedef pair<int,pii> piii;
int par[MAXN+MAXM],deg[MAXN],cost[MAXN+MAXM],N,depth[MAXN+MAXM],pa[LOG][MAXN+MAXM];
bool bisaswap[MAXN+MAXM];
vector<piii> edges;
vector<int> adj[MAXN+MAXM];

int find(int x){
	if(par[x]==x)return x;
	return par[x]=find(par[x]);
}

int LCA(int u,int v){
	if(depth[u]<depth[v])swap(u,v);
	int diff=depth[u]-depth[v];
	for(int i=LOG-1;i>=0;i--){
		if(diff & (1<<i))u=pa[i][u];
	}
	if(u==v)return u;
	for(int i=LOG-1;i>=0;i--){
		if(pa[i][u]!=pa[i][v]){
			u=pa[i][u];
			v=pa[i][v];
		}
	}
	return pa[0][u];
}

void dfs(int now){
	for(auto nxt : adj[now]){
		pa[0][nxt]=now;
		for(int i=1;i<LOG;i++)pa[i][nxt]=pa[i-1][pa[i-1][nxt]];
		depth[nxt]=depth[now]+1;
		dfs(nxt);
	}
}

void init(int n, int m,
          vector<int> U, vector<int> V, vector<int> W) {
    N=n;
	for(int i=0;i<m;i++){
		U[i]++;V[i]++;
		edges.push_back({W[i],{U[i],V[i]}});
	}
	for(int i=1;i<=N;i++){
		par[i]=i;
		deg[i]=0;
		bisaswap[i]=false;
	}
	sort(edges.begin(),edges.end());
	for(auto isi : edges){
		int ortua=find(isi.se.fi),ortub=find(isi.se.se);
		deg[isi.se.fi]++;
		deg[isi.se.se]++;
		N++;
		par[N]=N;
		par[ortua]=N;
		par[ortub]=N;
		if(ortua==ortub){
			bisaswap[N]=true;
		}
		else if(bisaswap[ortua] || bisaswap[ortub] || deg[isi.se.fi]>=3 || deg[isi.se.se]>=3){
			bisaswap[N]=true;
		}
		cost[N]=isi.first;
		adj[N].push_back(ortua);
		if(ortua!=ortub)adj[N].push_back(ortub);
	}
	dfs(N);
}

int getMinimumFuelCapacity(int X, int Y) {
	if(!bisaswap[N])return -1;
	X++;Y++;
	int anc=LCA(X,Y);
	if(bisaswap[anc])return cost[anc];
	for(int i=LOG-1;i>=0;i--){
		if((1<<i)>depth[anc])continue;
		if(!bisaswap[pa[i][anc]]){
			anc=pa[i][anc];
		}
	}
	return cost[pa[0][anc]];
}
#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...