Submission #1307813

#TimeUsernameProblemLanguageResultExecution timeMemory
1307813namhhSwapping Cities (APIO20_swap)C++20
100 / 100
237 ms49304 KiB
#include <bits/stdc++.h>
#include "swap.h"
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 3e5+5;
const int lg = 19;
int n,par[N],h[N],st[N][lg],cur,ck[N],val[N],deg[N];
vector<int>adj[N];
int find(int u){
	if(u == par[u]) return u;
	return par[u] = find(par[u]);
}
void join(int u, int v, int w){
	int x = u;
	int y = v;
	u = find(u);
	v = find(v);
	deg[x]++;
	deg[y]++;
	par[u] = par[v] = par[cur] = cur;
	adj[cur].push_back(u);
	val[cur] = w;
	if(u != v) adj[cur].push_back(v);
	if(u == v || ck[u] || ck[v] || deg[x] >= 3 || deg[y] >= 3) ck[cur] = 1;
	cur++;
}
void dfs(int u, int p){
	st[u][0] = p;
	h[u] = h[p]+1;
	for(int i = 1; i < lg; i++) st[u][i] = st[st[u][i-1]][i-1];
	for(int v: adj[u]) dfs(v,u);
}
int lca(int u, int v){
	if(h[u] < h[v]) swap(u,v);
	for(int i = lg-1; i >= 0; i--){
		if(h[st[u][i]] >= h[v]) u = st[u][i];
	}
	if(u == v) return u;
	for(int i = lg-1; i >= 0; i--){
		if(st[u][i] != st[v][i]){
			u = st[u][i];
			v = st[v][i];
		}
	}
	return st[u][0];
}
struct edges{
	int u,v,w;
};
bool cmp(edges a, edges b){
	return a.w < b.w;
}
vector<edges>loj;
void init(int n, int m, vector<int>u, vector<int>v, vector<int>w){
	for(int i = 0; i < m; i++){
		u[i]++;
		v[i]++;
	    loj.push_back({u[i],v[i],w[i]});
	}
	sort(loj.begin(),loj.end(),cmp);
	for(int i = 1; i <= n; i++) par[i] = i;
	cur = n+1;
	for(auto[u,v,w]: loj) join(u,v,w);
	dfs(n+m,0);
}
int getMinimumFuelCapacity(int u, int v){
	u++;
	v++;
	int dm = lca(u,v);
	if(ck[dm]) return val[dm];
	for(int i = lg-1; i >= 0; i--){
		if(st[dm][i] != 0 && !ck[st[dm][i]]) dm = st[dm][i];
	}
	if(st[dm][0] == 0) return -1;
	else return val[st[dm][0]];
}
#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...