답안 #54817

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
54817 2018-07-05T07:17:52 Z 김세빈(#1509) Pipes (CEOI15_pipes) C++11
30 / 100
4149 ms 14204 KB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;

vector <pii> T;
vector <int> V[101010];
int P[101010][17];
int R[101010], K[101010], D[101010], S[101010];
bool chk[101010];
int n, m;

int calc(int p, int r)
{
	int ret = K[p];
	K[p] = 0;
	
	for(auto t: V[p]){
		if(t != r) ret += calc(t, p);
	}
	
	if(ret > 0) chk[p] = 1;
	
	return ret;
}

void reorder(int x, int p, int r, int f)
{
	int i, c;
	
	D[p] = D[r] + 1; R[p] = x;
	c = P[p][0]; P[p][0] = r;
	
	for(i=1;i<17;i++){
		P[p][i] = P[P[p][i-1]][i-1];
	}
	
	for(auto t: V[p]){
		if(t != r){
			if(t == c) reorder(x, t, p, chk[p]);
			else reorder(x, t, p, 0);
		}
	}
	
	if(c == r) chk[p] = f;
}

int lca(int a, int b)
{
	if(D[a] < D[b]) swap(a, b);
	
	int i;
	
	for(i=0;i<17;i++){
		if(D[a] - D[b] & (1<<i)) a = P[a][i]; 
	}
	
	for(i=16;i>=0;i--){
		if(P[a][i] != P[b][i]) a = P[a][i], b = P[b][i];
	}
	
	return a == b? a : P[a][0];
}

int main()
{
	int i, a, b, c;
	
	scanf("%d%d", &n, &m);
	
	for(i=1;i<=n;i++){
		S[i] = 1;
		R[i] = i;
	}
	
	for(i=1;i<=m;i++){
		scanf("%d%d", &a, &b);
		c = lca(a, b);
		if(c == 0){
			if(S[R[a]] > S[R[b]]) swap(a, b);
			calc(R[a], 0);
			
			V[a].push_back(b);
			V[b].push_back(a);
			
			S[R[b]] += S[R[a]];
			reorder(R[b], a, b, 0);
		}
		else{
			K[c] -= 2;
			K[a] ++, K[b] ++;
		}
	}
	
	for(i=1;i<=n;i++){
		if(R[i] == i) calc(R[i], 0);
	}
	
	for(i=1;i<=n;i++){
		if(R[i] != i && !chk[i]) printf("%d %d\n", i, P[i][0]);
	}
	
	return 0;
}

Compilation message

pipes.cpp: In function 'int lca(int, int)':
pipes.cpp:56:11: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   if(D[a] - D[b] & (1<<i)) a = P[a][i];
      ~~~~~^~~~~~
pipes.cpp: In function 'int main()':
pipes.cpp:70:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~
pipes.cpp:78:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2688 KB Output is correct
2 Incorrect 4 ms 2816 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 3288 KB Output is correct
2 Incorrect 12 ms 3200 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 208 ms 3072 KB Output is correct
2 Incorrect 193 ms 3072 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 378 ms 3856 KB Output is correct
2 Incorrect 445 ms 3960 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 793 ms 5476 KB Output is correct
2 Correct 576 ms 6320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1270 ms 10752 KB Output is correct
2 Incorrect 1081 ms 10744 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 2008 ms 11944 KB Output is correct
2 Correct 1973 ms 11856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2986 ms 14072 KB Output is correct
2 Incorrect 2797 ms 14204 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 3762 ms 14204 KB Output is correct
2 Incorrect 3967 ms 14148 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 4149 ms 13508 KB Output is correct
2 Correct 3282 ms 14132 KB Output is correct