답안 #966552

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
966552 2024-04-20T03:47:58 Z penguin133 자매 도시 (APIO20_swap) C++17
6 / 100
223 ms 40336 KB
#include <bits/stdc++.h>
using namespace std;
#include "swap.h"
//#define int long long
#define pi pair<int, int>
#define pii pair<int, pi>
#define fi first
#define se second
#ifdef _WIN32
#define getchar_unlocked _getchar_nolock
#endif
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

vector <int> waiting[200005];
int par[200005], val[200005], deg[200005], good[200005], up[20][200005], dep[200005];
int cnt = 1;
pi adj[200005];
int getr(int x){return par[x] == x ? x : par[x] = getr(par[x]);}
void merge(int a, int b, int c){
	a = getr(a); b = getr(b);
	if(a == b)return;
	par[a] = par[b] = up[0][a] = up[0][b] = cnt;
	val[cnt] = c;
	adj[cnt] = {a, b};
	cnt++;
}

int par2[200005];
int g2(int x){return par2[x] == x ? x : par2[x] = g2(par2[x]);}
void m2(int a, int b){par2[g2(b)] = g2(a);}

void dfs(int x, int d){
	//cout << x << '\n';
	dep[x] = d;
	if(!adj[x].fi)return;
	dfs(adj[x].fi, d + 1);
	dfs(adj[x].se, d + 1);
}

int lca(int u, int v){
	if(dep[u] > dep[v])swap(u, v);
	int df = dep[v] -dep[u];
	for(int i = 0; i < 19; i++)if(df >> i & 1)v = up[i][v];
	if(u ==v )return u;
	for(int i = 19; i >=0 ; i--)if(up[i][u] != up[i][v])u = up[i][u], v = up[i][v];
	return up[0][u];
}

void init(int N, int M,
          std::vector<int> U, std::vector<int> V, std::vector<int> W) {
	vector <pii> bb;
	cnt = N;
	for(int i = 0; i < 2 * N; i++)par[i] = par2[i] = i;
	for(int i = 0; i < M; i++)bb.push_back({W[i], {U[i], V[i]}});
	sort(bb.begin(), bb.end());
	for(auto i : bb){
		int a = i.se.fi, b = i.se.se, w = i.fi;
		if(g2(a) == g2(b)){
			if(good[getr(a)])continue;
			good[getr(a)] = 1;
			queue <int> q;
			q.push(getr(a));
			while(!q.empty()){
				int x = q.front(); q.pop();
				for(auto j : waiting[x]){
					if(!good[j]){
						good[j] = 1;
						merge(x, j, w);
						q.push(j);
					}
				}
				waiting[x].clear();
			}
		}
		else{
			m2(a, b);
			if(good[getr(a)] || good[getr(b)])merge(a, b, w);
			else{
				deg[a]++; deg[b]++;
				if(max(deg[a], deg[b]) >= 3){
					good[getr(a)] = good[getr(b)] = 1;
					merge(a, b, w);
					queue <int> q;
					q.push(getr(a));
					while(!q.empty()){
						int x = q.front(); q.pop();
						for(auto j : waiting[x]){
							if(!good[j]){
								good[j] = 1;
								merge(x, j, w);
								q.push(j);
							}
						}
						waiting[x].clear();
					}
				}
				else waiting[getr(a)].push_back(getr(b)), waiting[getr(b)].push_back(getr(a));
			}
		}
	}
	for(int i = cnt - 1; i >= N; i--)if(!dep[i])dfs(i, 1);
	for(int i = 1; i <= 19; i++)for(int j = 0; j < 2 * N; j++)up[i][j] = up[i - 1][up[i - 1][j]];
}

int getMinimumFuelCapacity(int X, int Y) {
  if(getr(X) != getr(Y))return -1;
  //cout << lca(X, Y) << ' ';
  return val[lca(X, Y)];
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 20568 KB Output is correct
2 Correct 4 ms 20572 KB Output is correct
3 Correct 4 ms 20572 KB Output is correct
4 Correct 4 ms 20572 KB Output is correct
5 Correct 4 ms 20828 KB Output is correct
6 Correct 4 ms 20828 KB Output is correct
7 Correct 5 ms 20824 KB Output is correct
8 Correct 4 ms 20828 KB Output is correct
9 Correct 43 ms 30300 KB Output is correct
10 Correct 50 ms 32200 KB Output is correct
11 Correct 50 ms 31952 KB Output is correct
12 Correct 52 ms 32452 KB Output is correct
13 Correct 52 ms 32788 KB Output is correct
14 Correct 45 ms 30660 KB Output is correct
15 Correct 93 ms 35784 KB Output is correct
16 Correct 110 ms 35596 KB Output is correct
17 Correct 94 ms 36432 KB Output is correct
18 Correct 92 ms 36548 KB Output is correct
19 Correct 70 ms 31644 KB Output is correct
20 Correct 186 ms 39728 KB Output is correct
21 Correct 181 ms 39672 KB Output is correct
22 Correct 223 ms 40336 KB Output is correct
23 Correct 188 ms 40336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 20568 KB Output is correct
2 Correct 4 ms 20572 KB Output is correct
3 Incorrect 169 ms 36368 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 20568 KB Output is correct
2 Correct 4 ms 20572 KB Output is correct
3 Correct 4 ms 20572 KB Output is correct
4 Correct 4 ms 20572 KB Output is correct
5 Correct 4 ms 20828 KB Output is correct
6 Correct 4 ms 20828 KB Output is correct
7 Correct 5 ms 20824 KB Output is correct
8 Correct 4 ms 20828 KB Output is correct
9 Correct 4 ms 24668 KB Output is correct
10 Incorrect 4 ms 24924 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 24668 KB Output is correct
2 Correct 4 ms 20568 KB Output is correct
3 Correct 4 ms 20572 KB Output is correct
4 Correct 4 ms 20572 KB Output is correct
5 Correct 4 ms 20572 KB Output is correct
6 Correct 4 ms 20828 KB Output is correct
7 Correct 4 ms 20828 KB Output is correct
8 Correct 5 ms 20824 KB Output is correct
9 Correct 4 ms 20828 KB Output is correct
10 Correct 43 ms 30300 KB Output is correct
11 Correct 50 ms 32200 KB Output is correct
12 Correct 50 ms 31952 KB Output is correct
13 Correct 52 ms 32452 KB Output is correct
14 Correct 52 ms 32788 KB Output is correct
15 Incorrect 4 ms 24924 KB Output isn't correct
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 20568 KB Output is correct
2 Correct 4 ms 20572 KB Output is correct
3 Correct 4 ms 20572 KB Output is correct
4 Correct 4 ms 20572 KB Output is correct
5 Correct 4 ms 20828 KB Output is correct
6 Correct 4 ms 20828 KB Output is correct
7 Correct 5 ms 20824 KB Output is correct
8 Correct 4 ms 20828 KB Output is correct
9 Correct 43 ms 30300 KB Output is correct
10 Correct 50 ms 32200 KB Output is correct
11 Correct 50 ms 31952 KB Output is correct
12 Correct 52 ms 32452 KB Output is correct
13 Correct 52 ms 32788 KB Output is correct
14 Correct 45 ms 30660 KB Output is correct
15 Correct 93 ms 35784 KB Output is correct
16 Correct 110 ms 35596 KB Output is correct
17 Correct 94 ms 36432 KB Output is correct
18 Correct 92 ms 36548 KB Output is correct
19 Incorrect 169 ms 36368 KB Output isn't correct
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 24668 KB Output is correct
2 Correct 4 ms 20568 KB Output is correct
3 Correct 4 ms 20572 KB Output is correct
4 Correct 4 ms 20572 KB Output is correct
5 Correct 4 ms 20572 KB Output is correct
6 Correct 4 ms 20828 KB Output is correct
7 Correct 4 ms 20828 KB Output is correct
8 Correct 5 ms 20824 KB Output is correct
9 Correct 4 ms 20828 KB Output is correct
10 Correct 43 ms 30300 KB Output is correct
11 Correct 50 ms 32200 KB Output is correct
12 Correct 50 ms 31952 KB Output is correct
13 Correct 52 ms 32452 KB Output is correct
14 Correct 52 ms 32788 KB Output is correct
15 Correct 45 ms 30660 KB Output is correct
16 Correct 93 ms 35784 KB Output is correct
17 Correct 110 ms 35596 KB Output is correct
18 Correct 94 ms 36432 KB Output is correct
19 Correct 92 ms 36548 KB Output is correct
20 Incorrect 169 ms 36368 KB Output isn't correct
21 Halted 0 ms 0 KB -