답안 #54818

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
54818 2018-07-05T07:19:42 Z 김세빈(#1509) Pipes (CEOI15_pipes) C++11
100 / 100
4740 ms 14200 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 Correct 4 ms 2688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 3200 KB Output is correct
2 Correct 10 ms 3184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 200 ms 3072 KB Output is correct
2 Correct 189 ms 3152 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 388 ms 3840 KB Output is correct
2 Correct 443 ms 3832 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 886 ms 5496 KB Output is correct
2 Correct 552 ms 6036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1230 ms 10836 KB Output is correct
2 Correct 1220 ms 10744 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2134 ms 12000 KB Output is correct
2 Correct 1643 ms 11808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3170 ms 14072 KB Output is correct
2 Correct 2808 ms 14200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3482 ms 14084 KB Output is correct
2 Correct 3569 ms 14200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4740 ms 13504 KB Output is correct
2 Correct 3961 ms 14176 KB Output is correct