답안 #136325

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
136325 2019-07-25T07:02:26 Z 김세빈(#3258) Link (CEOI06_link) C++14
0 / 100
500 ms 48748 KB
#include <bits/stdc++.h>

using namespace std;

vector <int> V[505050];
int D[505050], P[505050];
int K[505050];
int X[20][505050];
int chk1[505050], chk2[505050];
int n, k, ans;

void dfs(int p, int v)
{
	for(int &t: V[p]){
		dfs(t, 0);
		K[p] = max(K[p], K[t] - 1);
	}
	
	if(!v && !K[p]){
		ans ++; K[p] = k;
	}
}

int calc(vector <int> &V)
{
	int m, i, j, t, s, ret;
	
	ret = 1e9;
	
	m = V.size();
	for(i=0; i<m; i++){
		V.push_back(V[i]);
	}
	
	for(i=0, j=0; i<m+m; i++){
		for(; j<m+m && (j - i <= k || V[j]); j++);
		X[0][i] = j;
	}
	
	X[0][m + m] = m + m;
	
	for(i=1; i<=19; i++){
		for(j=0; j<=m+m; j++){
			X[i][j] = X[i - 1][X[i - 1][j]];
		}
	}
	
	for(i=0; i<m; i++){
		s = 1; t = i;
		for(j=19; j>=0; j--){
			if(X[j][t] < m + i){
				t = X[j][t];
				s += 1 << j;
			}
		}
		ret = min(ret, s);
	}
	
	return ret;
}

int main()
{
	vector <int> T;
	int i, j, x, y;
	
	scanf("%d%d", &n, &k);
	
	for(i=1; i<=n; i++){
		scanf("%d%d", &x, &y);
		P[x] = y; D[y] ++;
	}
	
	K[1] = k + 1;
	
	for(i=1; i<=n; i++){
		for(j=i; !chk1[j]; j=P[j]) chk1[j] = i;
		if(chk1[j] != i) continue;
		for(; !chk2[j]; j=P[j]) chk2[j] = 1;
	}
	
	for(i=1; i<=n; i++){
		if(!chk2[i]){
			V[P[i]].push_back(i);
		}
	}
	
	for(i=1; i<=n; i++){
		if(chk2[i]) dfs(i, 1);
	}
	
	for(i=1; i<=n; i++){
		if(chk2[i]){
			for(j=i; chk2[j]; j=P[j]){
				K[P[j]] = max(K[P[j]], K[j] - 1);
				chk2[j] = 0;
			}
			
			for(j=i; chk1[j]; j=P[j]){
				K[P[j]] = max(K[P[j]], K[j] - 1);
				chk1[j] = 0;
			}
			
			T.clear();
			
			x = 0;
			
			for(j=i; !chk1[j]; j=P[j]){
				T.push_back(K[j]? 0 : 1);
				if(!K[j]) x ++;
				chk1[j] = 1;
			}
			
			if(x) ans += calc(T);
		}
	}
	
	printf("%d\n", ans);
	
	return 0;
}

Compilation message

link.cpp: In function 'int main()':
link.cpp:67:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &k);
  ~~~~~^~~~~~~~~~~~~~~~
link.cpp:70:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &x, &y);
   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 12408 KB Output isn't correct
2 Incorrect 14 ms 12408 KB Output isn't correct
3 Incorrect 13 ms 12412 KB Output isn't correct
4 Incorrect 17 ms 12536 KB Output isn't correct
5 Incorrect 18 ms 12664 KB Output isn't correct
6 Incorrect 28 ms 14328 KB Output isn't correct
7 Incorrect 39 ms 15224 KB Output isn't correct
8 Incorrect 50 ms 17116 KB Output isn't correct
9 Incorrect 72 ms 22776 KB Output isn't correct
10 Incorrect 73 ms 20712 KB Output isn't correct
11 Incorrect 127 ms 38256 KB Output isn't correct
12 Incorrect 164 ms 21368 KB Output isn't correct
13 Incorrect 207 ms 32620 KB Output isn't correct
14 Incorrect 273 ms 34036 KB Output isn't correct
15 Incorrect 286 ms 38380 KB Output isn't correct
16 Incorrect 374 ms 46320 KB Output isn't correct
17 Incorrect 380 ms 41424 KB Output isn't correct
18 Incorrect 462 ms 41672 KB Output isn't correct
19 Incorrect 450 ms 41976 KB Output isn't correct
20 Incorrect 439 ms 41072 KB Output isn't correct
21 Incorrect 431 ms 46044 KB Output isn't correct
22 Incorrect 428 ms 45804 KB Output isn't correct
23 Incorrect 500 ms 48748 KB Output isn't correct
24 Incorrect 450 ms 44904 KB Output isn't correct
25 Incorrect 497 ms 43880 KB Output isn't correct