답안 #679528

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
679528 2023-01-08T12:51:27 Z Dan4Life 자매 도시 (APIO20_swap) C++17
6 / 100
478 ms 66456 KB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back

const int maxn = (int)5e5+10;
const int lgn = 20;

int n, m, num;
int jmp[lgn][maxn];
vector<int> adj[maxn];
bool line[maxn], good[maxn];
struct Edge{ int u, v, w; };
int p[maxn], lev[maxn], wei[maxn], deg[maxn];

Edge edge[maxn];

int getPath(int x, int steps){
	for(int i = lgn-1; i >= 0; i--)
		if(steps&(1<<i) and x!=-1) x = jmp[i][x];
	return x; 
}

int lca(int a, int b){
	if(a==b) return a;
	if(jmp[0][a]==jmp[0][b]) return jmp[0][a];
	if(lev[a] < lev[b]) swap(a,b);
	a = getPath(a, lev[a]-lev[b]);
	for(int i = lgn-1; i >= 0; i--)
		if(jmp[i][a]!=-1 and jmp[i][a]!=jmp[i][b])
			a = jmp[i][a], b = jmp[i][b];
	return lca(a,b);
}

int findSet(int i){ return p[i]==i?i:p[i]=findSet(p[i]); }
bool isSameSet(int i, int j) { return findSet(i)==findSet(j); }

void unionSet(Edge &e){
	int i = e.u, j = e.v; wei[num] = e.w;
	int x = findSet(i), y = findSet(j);
	deg[x]++, deg[y]++;
	p[x]=p[y]=p[num]=num;
	if(x!=y) adj[num].pb(y);
	adj[num].pb(x); line[num]^=(x==y) | !line[x] | !line[y];
	good[num] |= good[x] | good[y] | !line[num] | (deg[x]>=3) | (deg[y]>=3);
	num++;
}

void dfs(int s, int p){
	if(p!=-1) lev[s] = lev[p]+1, jmp[0][s] = p;
	for(auto u : adj[s]) if(u!=p) dfs(u,s);
}

void init(int N, int M, vector<int> u, vector<int> v, vector<int> w) {
	n = N, m = M; num = n; memset(jmp,-1,sizeof(jmp));
	for(int i = 0; i <= n+m; i++) p[i] = i, line[i] = 1;
	for(int i = 0; i < m; i++) edge[i] = {u[i],v[i],w[i]};
	sort(edge,edge+m,[&](Edge &x, Edge &y){ return x.w<y.w; });
	for(int i = 0; i < m; i++) unionSet(edge[i]);
	dfs(num-1,-1);
	for(int i = 1; i < lgn; i++)
		for(int j = 0; j+(1<<i)-1 < num; j++)
			if(jmp[i-1][j]!=-1) jmp[i][j] = jmp[i-1][jmp[i-1][j]];
}

int getMinimumFuelCapacity(int x, int y) {
	int z = lca(x,y);
	while(jmp[0][z]!=-1 and !good[z])
		for(int i = lgn-1; i >= 0; i--) 
			if(jmp[i][z]!=-1 and !good[z]) z = jmp[i][z];
	if(good[z]) return wei[z];
	if(jmp[0][z]!=-1) z=jmp[0][z];
	return good[z]?wei[z]:-1;
}

/*
5 6
0 1 4
0 2 4
1 2 1
1 3 2
1 4 10
2 3 3
3
1 2
2 4
0 1
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 51152 KB Output is correct
2 Correct 24 ms 51156 KB Output is correct
3 Correct 22 ms 51216 KB Output is correct
4 Correct 24 ms 51172 KB Output is correct
5 Correct 24 ms 51284 KB Output is correct
6 Correct 23 ms 51212 KB Output is correct
7 Correct 22 ms 51284 KB Output is correct
8 Correct 22 ms 51288 KB Output is correct
9 Correct 69 ms 58772 KB Output is correct
10 Correct 84 ms 60416 KB Output is correct
11 Correct 82 ms 60296 KB Output is correct
12 Correct 96 ms 60848 KB Output is correct
13 Correct 79 ms 63180 KB Output is correct
14 Correct 82 ms 58956 KB Output is correct
15 Correct 194 ms 62304 KB Output is correct
16 Correct 203 ms 62116 KB Output is correct
17 Correct 203 ms 62604 KB Output is correct
18 Correct 390 ms 64916 KB Output is correct
19 Correct 108 ms 56124 KB Output is correct
20 Correct 202 ms 63504 KB Output is correct
21 Correct 205 ms 63492 KB Output is correct
22 Correct 228 ms 64096 KB Output is correct
23 Correct 396 ms 66336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 51152 KB Output is correct
2 Correct 24 ms 51156 KB Output is correct
3 Incorrect 478 ms 66456 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 51152 KB Output is correct
2 Correct 24 ms 51156 KB Output is correct
3 Correct 22 ms 51216 KB Output is correct
4 Correct 24 ms 51172 KB Output is correct
5 Correct 24 ms 51284 KB Output is correct
6 Correct 23 ms 51212 KB Output is correct
7 Correct 22 ms 51284 KB Output is correct
8 Correct 22 ms 51288 KB Output is correct
9 Incorrect 23 ms 51156 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 51156 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 51152 KB Output is correct
2 Correct 24 ms 51156 KB Output is correct
3 Correct 22 ms 51216 KB Output is correct
4 Correct 24 ms 51172 KB Output is correct
5 Correct 24 ms 51284 KB Output is correct
6 Correct 23 ms 51212 KB Output is correct
7 Correct 22 ms 51284 KB Output is correct
8 Correct 22 ms 51288 KB Output is correct
9 Correct 69 ms 58772 KB Output is correct
10 Correct 84 ms 60416 KB Output is correct
11 Correct 82 ms 60296 KB Output is correct
12 Correct 96 ms 60848 KB Output is correct
13 Correct 79 ms 63180 KB Output is correct
14 Correct 82 ms 58956 KB Output is correct
15 Correct 194 ms 62304 KB Output is correct
16 Correct 203 ms 62116 KB Output is correct
17 Correct 203 ms 62604 KB Output is correct
18 Correct 390 ms 64916 KB Output is correct
19 Incorrect 478 ms 66456 KB Output isn't correct
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 51156 KB Output isn't correct
2 Halted 0 ms 0 KB -