Submission #1191689

#TimeUsernameProblemLanguageResultExecution timeMemory
1191689lovrot자매 도시 (APIO20_swap)C++20
6 / 100
94 ms15652 KiB
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include "swap.h"

#define X first
#define Y second
#define PB push_back
#define deb(...) fprintf(stderr, __VA__ARGS__)

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int LOG = 19;
const int N = 1 << LOG;

int un[N], jmp[N], par[N], dep[N];
int mxd[N], cyc[N], deg[N], weg[N], newn;
int l[N], r[N];

int trazi(int u) { return un[u] == -1 ? u : un[u] = trazi(un[u]); }

void unija(int u, int v, int w) { 
	int u_ = trazi(u);
	int v_ = trazi(v);

	deg[u] ++;
	deg[v] ++;
	mxd[u_] = max(mxd[u_], deg[u]);
	mxd[v_] = max(mxd[v_], deg[v]);

	int t = ++newn;

	weg[t] = w;
	mxd[t] = max(mxd[u_], mxd[v_]);
	cyc[t] = cyc[u_] | cyc[v_] | (u_ == v_);	

	par[u_] = par[v_] = t;
	un[u_] = un[v_] = t;
}

vector<pair<int, pii>> swe;

void init(int n, int m, vector<int> U, vector<int> V, vector<int> W) {
	newn = n - 1;
	memset(un, -1, sizeof(un));
	
	for(int i = 0; i < m; ++i) { swe.PB({W[i], {U[i], V[i]}}); }

	sort(swe.begin(), swe.end());

	for(pair<int, pii> &i : swe) { 
		unija(i.Y.X, i.Y.Y, i.X);
	}

	jmp[newn] = newn;
	dep[newn] = 0;
	par[newn] = -1;

	for(int i = newn - 1; i >= 0; --i) { 
		int p = par[i];
		dep[i] = dep[p] + 1;

//		printf("%d %d %d\n", i, par[i], weg[i]);

		if(dep[p] - dep[jmp[p]] == dep[jmp[p]] - dep[jmp[jmp[p]]]) { 
			jmp[i] = jmp[jmp[p]];
		} else {
			jmp[i] = p;
		}

		l[i] = N;
		r[i] = -1;
	}

	for(int i = 0; i < newn; ++i) { 
		if(i < n) { 
			l[i] = r[i] = i;
		}
		l[par[i]] = min(l[par[i]], l[i]);
		r[par[i]] = max(r[par[i]], r[i]);
	}
}

bool ok(int u, int v) { 
	return (cyc[u] || mxd[u] >= 3) && (l[u] <= v && v <= r[u]);
}

int getMinimumFuelCapacity(int x, int y) { 
	if(x == y) { return 0; }

	for(; !ok(x, y); ) { 
		if(ok(jmp[x], y)) { x = par[x]; }
		else {
			if(jmp[x] == x) { return -1; }
			x = jmp[x];
		}
	}

	return weg[x];
}

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