답안 #150584

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
150584 2019-09-01T08:40:29 Z 잉여로운 고3(#3749, imyujin, sebinkim) 갈라파고스 여행 (FXCUP4_island) C++17
0 / 100
328 ms 26468 KB
#include <bits/stdc++.h>

#include "island.h"

using namespace std;

typedef pair <int, int> pii;

vector <pii> T[101010];
int P[22][101010], K[22][101010];
int X[101010], D[101010], U[101010];
int n, m;

int find(int p) { return p == U[p]? p : U[p] = find(U[p]); }

void dfs(int p, int r)
{
	for(pii &t: T[p]){
		if(t.first != r){
			D[t.first] = D[p] + 1;
			P[0][t.first] = p;
			K[0][t.first] = t.second;
			dfs(t.first, p);
		}
	}
}

void Init(int k, vector <int> F, vector <int> S, vector <int> E)
{
	int i, j;
	
	n = F.size(), m = S.size();
	
	for(i=0; i<n; i++){
		X[F[i]] = i;
		U[i] = i;
	}
	
	for(i=0; i<m; i++){
		if(find(S[i]) != find(E[i])){
			T[S[i]].emplace_back(E[i], i);
			T[E[i]].emplace_back(S[i], i);
			U[find(S[i])] = find(E[i]);
		}
	}
	
	dfs(0, 0);
	
	for(i=1; i<=16; i++){
		for(j=0; j<n; j++){
			P[i][j] = P[i - 1][P[i - 1][j]];
			K[i][j] = min(K[i - 1][j], K[i - 1][P[i - 1][j]]);
		}
	}
}

int Separate(int p, int q)
{
	p = X[p]; q = X[q];
	if(D[p] < D[q]) swap(p, q);
	
	int i, ans;
	
	ans = 1e9;
	
	for(i=0; i<=16; i++){
		if(D[p] - D[q] & 1 << i){
			ans = min(ans, K[i][p]);
			p = P[i][p];
		}
	}
	
	if(p == q) return ans;
	
	for(i=16; i>=0; i--){
		if(P[i][p] != P[i][q]){
			ans = min(ans, min(K[i][p], K[i][q]));
			p = P[i][p]; q = P[i][q];
		}
	}
	
	return min(ans, min(K[0][p], K[0][q])) + 1;
}

Compilation message

island.cpp: In function 'int Separate(int, int)':
island.cpp:67:11: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   if(D[p] - D[q] & 1 << i){
      ~~~~~^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 328 ms 26468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 2816 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 2816 KB Output isn't correct
2 Halted 0 ms 0 KB -