답안 #218188

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
218188 2020-04-01T11:54:30 Z mieszko11b 수도 (JOI20_capital_city) C++14
100 / 100
2898 ms 431420 KB
#include <bits/stdc++.h>

using namespace std;

using ii = pair<int, int>;

#define X first
#define Y second

int n, k, m;
int c[200007];
vector<int> G[200007];
vector<ii> C[200007];
vector<ii> E;
vector<int> G2[4000007];
int num[20][200007], jp[20][200007];
int nxt = 1;
int ord[200007];
int h[200007];
vector<int> topo;
bool vis[4000007];
int scc[4000007], scc_size[4000007];
int scc_cnt;

void dfs(int w) {
	ord[w] = nxt++;
	for(int u : G[w]) {
		if(u != jp[0][w]) {
			jp[0][u] = w;
			h[u] = h[w] + 1;
			dfs(u);
		}
	}
}

void mark_path(int a, int b, int c) {
	if(h[a] < h[b])
		swap(a, b);
		
	for(int j = 17 ; j >= 0 ; j--) {
		if(h[jp[j][a]] >= h[b]) {
			E.emplace_back(c, num[j][a]);
			a = jp[j][a];
		}
	}
	
	if(a == b)
		return ;
		
	for(int j = 17 ; j >= 0 ; j--) {
		if(jp[j][a] != jp[j][b]) {
			E.emplace_back(c, num[j][a]);
			E.emplace_back(c, num[j][b]);
			a = jp[j][a];
			b = jp[j][b];
		}
	}
	
	E.emplace_back(c, num[0][a]);
}

void dfs2(int w) {
	if(vis[w])
		return ;
	vis[w] = 1;
	for(int u : G2[w])
		dfs2(u);
	topo.push_back(w);
}

void dfs3(int w) {
	for(int u : G2[w]) {
		if(!scc[u]) {
			scc[u] = scc[w];
			if(u && u <= k)
				scc_size[scc[u]]++;
			dfs3(u);
		}
	}
}

int main() {
	scanf("%d%d", &n, &k);
	for(int i = 1 ; i < n ; i++) {
		int a, b;
		scanf("%d%d", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	for(int i = 1 ; i <= n ; i++)
		scanf("%d", &c[i]);

	h[1] = 1;
	dfs(1);
		
	m = k;
	
	for(int i = 1 ; i <= n ; i++) {
		num[0][i] = ++m;
		//~ E.emplace_back(num[0][i], c[i]);
		if(jp[0][i])
			E.emplace_back(num[0][i], c[jp[0][i]]);
	}
	
	for(int j = 1 ; j <= 17 ; j++) {
		for(int i = 1 ; i <= n ; i++) {
			num[j][i] = ++m;
			jp[j][i] = jp[j - 1][jp[j - 1][i]];
			E.emplace_back(num[j][i], num[j - 1][i]);
			E.emplace_back(num[j][i], num[j - 1][jp[j - 1][i]]);
		}
	}
	
	for(int i = 1 ; i <= n ; i++)
		C[c[i]].emplace_back(ord[i], i);
		
	for(int i = 1 ; i <= k ; i++) {
		sort(C[i].begin(), C[i].end());
		for(int j = 0 ; j + 1 < C[i].size() ; j++)
			mark_path(C[i][j].Y, C[i][j + 1].Y, i);
	}
	
	for(auto p : E) {
		//~ cout << p.X << " " << p.Y << endl;
		G2[p.X].push_back(p.Y);
	}
		
	for(int i = 1 ; i <= m ; i++)
		if(!vis[i])
			dfs2(i);
	
	reverse(topo.begin(), topo.end());
	
	for(int i = 1 ; i <= m ; i++)
		G2[i].clear();
		
	for(auto p : E)
		G2[p.Y].push_back(p.X);
	
	for(int w : topo) {
		if(!scc[w]) {
			scc[w] = ++scc_cnt;
			if(w && w <= k)
				scc_size[scc[w]]++;
			dfs3(w);
		}
	}
	
	//~ for(int i = 0 ; i <= m ; i++)
		//~ cout << i << ": " << scc[i] << endl;
	
	for(auto p : E)
		if(scc[p.X] != scc[p.Y])
			scc_size[scc[p.X]] = 0;
	
	int res = 1e9;
	for(int i = 1 ; i <= scc_cnt ; i++) {
		//~ cout << i << " " << " " << scc_size[i] << endl;
		if(scc_size[i])
			res = min(res, scc_size[i] - 1);
	}
	
	printf("%d\n", res);
	
	return 0;
}

Compilation message

capital_city.cpp: In function 'int main()':
capital_city.cpp:119:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 0 ; j + 1 < C[i].size() ; j++)
                   ~~~~~~^~~~~~~~~~~~~
capital_city.cpp:83:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &k);
  ~~~~~^~~~~~~~~~~~~~~~
capital_city.cpp:86:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~
capital_city.cpp:91:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &c[i]);
   ~~~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 103928 KB Output is correct
2 Correct 60 ms 103928 KB Output is correct
3 Correct 60 ms 103936 KB Output is correct
4 Correct 59 ms 103928 KB Output is correct
5 Correct 60 ms 103928 KB Output is correct
6 Correct 59 ms 103928 KB Output is correct
7 Correct 60 ms 103928 KB Output is correct
8 Correct 60 ms 103928 KB Output is correct
9 Correct 61 ms 103928 KB Output is correct
10 Correct 61 ms 103800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 103928 KB Output is correct
2 Correct 60 ms 103928 KB Output is correct
3 Correct 60 ms 103936 KB Output is correct
4 Correct 59 ms 103928 KB Output is correct
5 Correct 60 ms 103928 KB Output is correct
6 Correct 59 ms 103928 KB Output is correct
7 Correct 60 ms 103928 KB Output is correct
8 Correct 60 ms 103928 KB Output is correct
9 Correct 61 ms 103928 KB Output is correct
10 Correct 61 ms 103800 KB Output is correct
11 Correct 70 ms 106876 KB Output is correct
12 Correct 70 ms 106864 KB Output is correct
13 Correct 70 ms 106864 KB Output is correct
14 Correct 69 ms 106888 KB Output is correct
15 Correct 74 ms 107028 KB Output is correct
16 Correct 71 ms 106832 KB Output is correct
17 Correct 68 ms 106864 KB Output is correct
18 Correct 69 ms 106864 KB Output is correct
19 Correct 70 ms 106864 KB Output is correct
20 Correct 68 ms 106864 KB Output is correct
21 Correct 70 ms 106864 KB Output is correct
22 Correct 70 ms 106864 KB Output is correct
23 Correct 73 ms 107120 KB Output is correct
24 Correct 70 ms 106864 KB Output is correct
25 Correct 70 ms 106736 KB Output is correct
26 Correct 74 ms 106996 KB Output is correct
27 Correct 70 ms 106740 KB Output is correct
28 Correct 70 ms 106864 KB Output is correct
29 Correct 70 ms 106864 KB Output is correct
30 Correct 72 ms 106864 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2879 ms 431420 KB Output is correct
2 Correct 1075 ms 397452 KB Output is correct
3 Correct 2898 ms 408916 KB Output is correct
4 Correct 1070 ms 397652 KB Output is correct
5 Correct 2812 ms 431060 KB Output is correct
6 Correct 1092 ms 397268 KB Output is correct
7 Correct 2704 ms 419264 KB Output is correct
8 Correct 1065 ms 394804 KB Output is correct
9 Correct 1575 ms 382120 KB Output is correct
10 Correct 1542 ms 380376 KB Output is correct
11 Correct 1604 ms 382420 KB Output is correct
12 Correct 1622 ms 383884 KB Output is correct
13 Correct 1625 ms 380372 KB Output is correct
14 Correct 1628 ms 384216 KB Output is correct
15 Correct 1694 ms 383828 KB Output is correct
16 Correct 1648 ms 380500 KB Output is correct
17 Correct 1645 ms 381140 KB Output is correct
18 Correct 1653 ms 381140 KB Output is correct
19 Correct 1724 ms 383468 KB Output is correct
20 Correct 1511 ms 384980 KB Output is correct
21 Correct 64 ms 103800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 103928 KB Output is correct
2 Correct 60 ms 103928 KB Output is correct
3 Correct 60 ms 103936 KB Output is correct
4 Correct 59 ms 103928 KB Output is correct
5 Correct 60 ms 103928 KB Output is correct
6 Correct 59 ms 103928 KB Output is correct
7 Correct 60 ms 103928 KB Output is correct
8 Correct 60 ms 103928 KB Output is correct
9 Correct 61 ms 103928 KB Output is correct
10 Correct 61 ms 103800 KB Output is correct
11 Correct 70 ms 106876 KB Output is correct
12 Correct 70 ms 106864 KB Output is correct
13 Correct 70 ms 106864 KB Output is correct
14 Correct 69 ms 106888 KB Output is correct
15 Correct 74 ms 107028 KB Output is correct
16 Correct 71 ms 106832 KB Output is correct
17 Correct 68 ms 106864 KB Output is correct
18 Correct 69 ms 106864 KB Output is correct
19 Correct 70 ms 106864 KB Output is correct
20 Correct 68 ms 106864 KB Output is correct
21 Correct 70 ms 106864 KB Output is correct
22 Correct 70 ms 106864 KB Output is correct
23 Correct 73 ms 107120 KB Output is correct
24 Correct 70 ms 106864 KB Output is correct
25 Correct 70 ms 106736 KB Output is correct
26 Correct 74 ms 106996 KB Output is correct
27 Correct 70 ms 106740 KB Output is correct
28 Correct 70 ms 106864 KB Output is correct
29 Correct 70 ms 106864 KB Output is correct
30 Correct 72 ms 106864 KB Output is correct
31 Correct 2879 ms 431420 KB Output is correct
32 Correct 1075 ms 397452 KB Output is correct
33 Correct 2898 ms 408916 KB Output is correct
34 Correct 1070 ms 397652 KB Output is correct
35 Correct 2812 ms 431060 KB Output is correct
36 Correct 1092 ms 397268 KB Output is correct
37 Correct 2704 ms 419264 KB Output is correct
38 Correct 1065 ms 394804 KB Output is correct
39 Correct 1575 ms 382120 KB Output is correct
40 Correct 1542 ms 380376 KB Output is correct
41 Correct 1604 ms 382420 KB Output is correct
42 Correct 1622 ms 383884 KB Output is correct
43 Correct 1625 ms 380372 KB Output is correct
44 Correct 1628 ms 384216 KB Output is correct
45 Correct 1694 ms 383828 KB Output is correct
46 Correct 1648 ms 380500 KB Output is correct
47 Correct 1645 ms 381140 KB Output is correct
48 Correct 1653 ms 381140 KB Output is correct
49 Correct 1724 ms 383468 KB Output is correct
50 Correct 1511 ms 384980 KB Output is correct
51 Correct 64 ms 103800 KB Output is correct
52 Correct 1510 ms 407616 KB Output is correct
53 Correct 1490 ms 407632 KB Output is correct
54 Correct 1509 ms 407508 KB Output is correct
55 Correct 1511 ms 407764 KB Output is correct
56 Correct 1508 ms 407636 KB Output is correct
57 Correct 1538 ms 407640 KB Output is correct
58 Correct 2060 ms 385748 KB Output is correct
59 Correct 2080 ms 386516 KB Output is correct
60 Correct 2477 ms 404820 KB Output is correct
61 Correct 2489 ms 402812 KB Output is correct
62 Correct 1090 ms 397656 KB Output is correct
63 Correct 1114 ms 397500 KB Output is correct
64 Correct 1046 ms 395348 KB Output is correct
65 Correct 1078 ms 397396 KB Output is correct
66 Correct 1322 ms 389276 KB Output is correct
67 Correct 1484 ms 390208 KB Output is correct
68 Correct 1338 ms 389336 KB Output is correct
69 Correct 1372 ms 384312 KB Output is correct
70 Correct 1381 ms 384428 KB Output is correct
71 Correct 1401 ms 389356 KB Output is correct
72 Correct 1354 ms 389364 KB Output is correct
73 Correct 1517 ms 387304 KB Output is correct
74 Correct 1332 ms 389304 KB Output is correct
75 Correct 1386 ms 384320 KB Output is correct
76 Correct 1646 ms 381912 KB Output is correct
77 Correct 1585 ms 381780 KB Output is correct
78 Correct 1733 ms 380928 KB Output is correct
79 Correct 1675 ms 379604 KB Output is correct
80 Correct 1537 ms 384596 KB Output is correct
81 Correct 1603 ms 381908 KB Output is correct
82 Correct 1703 ms 381908 KB Output is correct
83 Correct 1628 ms 380376 KB Output is correct
84 Correct 1737 ms 383444 KB Output is correct
85 Correct 1654 ms 382824 KB Output is correct
86 Correct 1702 ms 379672 KB Output is correct
87 Correct 1597 ms 381272 KB Output is correct
88 Correct 2156 ms 383764 KB Output is correct
89 Correct 2028 ms 381184 KB Output is correct
90 Correct 1975 ms 381132 KB Output is correct
91 Correct 2057 ms 383064 KB Output is correct
92 Correct 2118 ms 382168 KB Output is correct
93 Correct 2025 ms 381400 KB Output is correct
94 Correct 1997 ms 380884 KB Output is correct
95 Correct 2017 ms 382168 KB Output is correct
96 Correct 2128 ms 381172 KB Output is correct
97 Correct 2085 ms 383064 KB Output is correct