답안 #679512

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

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

int n, m, num;
int jmp[lgn][maxn];
vector<int> adj[maxn];
int p[maxn], lev[maxn], wei[maxn];
bool line[maxn], good[maxn];

struct Edge{ int u, v, w, i; };
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 jmp[0][a];
}

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[e.i] = e.w;
	int x = findSet(i), y = findSet(j);
	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];
	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],i};
	sort(edge,edge+m,[&](Edge &x, Edge &y){ return x.w<y.w; });
	for(int i = 0; i < m; i++) edge[i].i=i, unionSet(edge[i]);
	dfs(num-1,-1);
	for(int i = 1; i < lgn; i++)
		for(int j = 0; j+(1<<i)-1 < n+m; 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-n];
	//if(jmp[0][z]!=-1) z=jmp[0][z];
	return good[z]?wei[z-n]:-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 30 ms 61396 KB Output is correct
2 Correct 27 ms 61356 KB Output is correct
3 Correct 32 ms 61264 KB Output is correct
4 Correct 27 ms 61424 KB Output is correct
5 Correct 27 ms 61408 KB Output is correct
6 Correct 31 ms 61432 KB Output is correct
7 Correct 26 ms 61440 KB Output is correct
8 Correct 26 ms 61396 KB Output is correct
9 Correct 72 ms 68676 KB Output is correct
10 Correct 90 ms 70212 KB Output is correct
11 Correct 88 ms 70084 KB Output is correct
12 Correct 88 ms 70604 KB Output is correct
13 Correct 79 ms 72964 KB Output is correct
14 Correct 82 ms 68720 KB Output is correct
15 Correct 204 ms 72104 KB Output is correct
16 Correct 185 ms 71864 KB Output is correct
17 Correct 209 ms 72412 KB Output is correct
18 Correct 294 ms 74720 KB Output is correct
19 Correct 103 ms 66336 KB Output is correct
20 Correct 200 ms 73304 KB Output is correct
21 Correct 207 ms 73292 KB Output is correct
22 Correct 225 ms 73848 KB Output is correct
23 Correct 300 ms 76084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 61396 KB Output is correct
2 Correct 27 ms 61356 KB Output is correct
3 Incorrect 309 ms 76316 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 61396 KB Output is correct
2 Correct 27 ms 61356 KB Output is correct
3 Correct 32 ms 61264 KB Output is correct
4 Correct 27 ms 61424 KB Output is correct
5 Correct 27 ms 61408 KB Output is correct
6 Correct 31 ms 61432 KB Output is correct
7 Correct 26 ms 61440 KB Output is correct
8 Correct 26 ms 61396 KB Output is correct
9 Incorrect 26 ms 61260 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 26 ms 61260 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 61396 KB Output is correct
2 Correct 27 ms 61356 KB Output is correct
3 Correct 32 ms 61264 KB Output is correct
4 Correct 27 ms 61424 KB Output is correct
5 Correct 27 ms 61408 KB Output is correct
6 Correct 31 ms 61432 KB Output is correct
7 Correct 26 ms 61440 KB Output is correct
8 Correct 26 ms 61396 KB Output is correct
9 Correct 72 ms 68676 KB Output is correct
10 Correct 90 ms 70212 KB Output is correct
11 Correct 88 ms 70084 KB Output is correct
12 Correct 88 ms 70604 KB Output is correct
13 Correct 79 ms 72964 KB Output is correct
14 Correct 82 ms 68720 KB Output is correct
15 Correct 204 ms 72104 KB Output is correct
16 Correct 185 ms 71864 KB Output is correct
17 Correct 209 ms 72412 KB Output is correct
18 Correct 294 ms 74720 KB Output is correct
19 Incorrect 309 ms 76316 KB Output isn't correct
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 26 ms 61260 KB Output isn't correct
2 Halted 0 ms 0 KB -