답안 #135770

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
135770 2019-07-24T10:48:54 Z Sorting 경주 (Race) (IOI11_race) C++14
43 / 100
3000 ms 47864 KB
#include <bits/stdc++.h>
//#include "race.h"
 
using namespace std;
 
const int N = 2e5 + 7;
const int inf = 1e9;
const int K = 1e6 + 7;
 
int n, k;
vector <int> adj[N], len[N], adj_c[N], rv;
int sz[N];
 
bool used[N];
int link[N];
 
int find_cnt(int u, int p = -1){
	sz[u] = 1;
 
	for(int to: adj[u]){
		if(p == to || used[to]){
			continue;
		}
 
		sz[u] += find_cnt(to, u);
	}
 
	return sz[u];
}
 
int find_centroid(int u, int cnt, int p = -1){
	for(int to: adj[u]){
		if(to == p || used[to]){
			continue;
		}
 
		if(sz[to] > (cnt / 2)){
			return find_centroid(to, cnt, u);
		}
	}
 
	return u;
}	
 
int root;
 
void decompose(int u, int p = -1){
	int cnt = find_cnt(u);
	int cen = find_centroid(u, cnt);

	//cout << p << " -> " << cen << endl;
 
	if(p != -1){
		adj_c[p].push_back(cen);
	}
	else{
		root = cen;
	}
 
	used[cen] = true;
	for(int to: adj[cen]){
		if(!used[to]){
			decompose(to, cen);
		}
	}
	used[cen] = false;
}
 
int arr[K];
vector<pair<int, int> > vec;

int ans = inf;
 
void solve_k(int u, int pr, int sum, int d){
	if(sum > k){
		return;
	}
 
	vec.push_back({sum, d});
	if(arr[k - sum] != inf){
		ans = min(ans, d + arr[k - sum]);
	}

	for(int i = 0; i < adj[u].size(); i++){
		int to = adj[u][i];
		int l = len[u][i];
 
		if(used[to] || to == pr){
			continue;
		}
 
		solve_k(to, u, sum + l, d + 1);
	}
}
 
void solve(int u){
	used[u] = true;
	for(int to: adj_c[u]){
		solve(to);
	}
	rv.clear();
	
	for(int i = 0; i < adj[u].size(); i++){
		vec.clear();
		solve_k(adj[u][i], u, len[u][i], 1);

		for(pair<int, int> p: vec){
			if(arr[p.first] == inf){
				rv.push_back(p.first);
			}
			arr[p.first] = min(arr[p.first], p.second);
		}
	}

	for(int i: rv){
		arr[i] = inf;
	}
	
	used[u] = false;
}

clock_t t;
 
int best_path(int _n, int _k, int _h[][2], int _l[]){
 	t = clock();

	n = _n;
	k = _k;
 
	for(int i = 0; i < n - 1; i++){
		adj[_h[i][0]].push_back(_h[i][1]);
		adj[_h[i][1]].push_back(_h[i][0]);
 
		len[_h[i][0]].push_back(_l[i]);
		len[_h[i][1]].push_back(_l[i]);
	}
 
	decompose(0);

	float time_passed = (float)(clock() - t) / (float)CLOCKS_PER_SEC;

	if(time_passed > (float)0.5){
		return -21;
	}

	for(int i = 1; i < K; i++){
		arr[i] = inf;
	}
 
	solve(root);
 
	if(ans == inf){
		return -1;
	}
 
	return ans;
}
 
/*int _h[N][2], _l[N];
 
int main(){
	int _n, _k;
 
	cin >> _n >> _k;
 
	for(int i = 0; i < _n - 1; i++){
		cin >> _h[i][0] >> _h[i][1] >> _l[i];
 	}
 
 	cout << best_path(_n, _k, _h, _l) << "\n";
 
 	return 0;
}*/
/*
10 5
0 1 2
1 2 1
2 3 2 
3 4 3
4 5 1
5 6 5
6 7 1 
7 8 2
8 9 3
*/
/*
11 12
0 1 3
0 2 4
2 3 5
3 4 4
4 5 6
0 6 3
6 7 2
6 8 5
8 9 6
8 10 7
*/

Compilation message

race.cpp: In function 'void solve_k(int, int, int, int)':
race.cpp:84:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < adj[u].size(); i++){
                 ~~^~~~~~~~~~~~~~~
race.cpp: In function 'void solve(int)':
race.cpp:103:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < adj[u].size(); i++){
                 ~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 18424 KB Output is correct
2 Correct 18 ms 18428 KB Output is correct
3 Correct 19 ms 18296 KB Output is correct
4 Correct 18 ms 18424 KB Output is correct
5 Correct 18 ms 18296 KB Output is correct
6 Correct 18 ms 18424 KB Output is correct
7 Correct 18 ms 18296 KB Output is correct
8 Correct 18 ms 18296 KB Output is correct
9 Correct 19 ms 18424 KB Output is correct
10 Correct 18 ms 18424 KB Output is correct
11 Correct 18 ms 18428 KB Output is correct
12 Correct 18 ms 18428 KB Output is correct
13 Correct 18 ms 18396 KB Output is correct
14 Correct 18 ms 18296 KB Output is correct
15 Correct 19 ms 18296 KB Output is correct
16 Correct 18 ms 18300 KB Output is correct
17 Correct 18 ms 18424 KB Output is correct
18 Correct 19 ms 18424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 18424 KB Output is correct
2 Correct 18 ms 18428 KB Output is correct
3 Correct 19 ms 18296 KB Output is correct
4 Correct 18 ms 18424 KB Output is correct
5 Correct 18 ms 18296 KB Output is correct
6 Correct 18 ms 18424 KB Output is correct
7 Correct 18 ms 18296 KB Output is correct
8 Correct 18 ms 18296 KB Output is correct
9 Correct 19 ms 18424 KB Output is correct
10 Correct 18 ms 18424 KB Output is correct
11 Correct 18 ms 18428 KB Output is correct
12 Correct 18 ms 18428 KB Output is correct
13 Correct 18 ms 18396 KB Output is correct
14 Correct 18 ms 18296 KB Output is correct
15 Correct 19 ms 18296 KB Output is correct
16 Correct 18 ms 18300 KB Output is correct
17 Correct 18 ms 18424 KB Output is correct
18 Correct 19 ms 18424 KB Output is correct
19 Correct 18 ms 18300 KB Output is correct
20 Correct 18 ms 18296 KB Output is correct
21 Correct 20 ms 18424 KB Output is correct
22 Correct 19 ms 18488 KB Output is correct
23 Correct 19 ms 18428 KB Output is correct
24 Correct 20 ms 18424 KB Output is correct
25 Correct 20 ms 18424 KB Output is correct
26 Correct 19 ms 18424 KB Output is correct
27 Correct 19 ms 18424 KB Output is correct
28 Correct 23 ms 18424 KB Output is correct
29 Correct 21 ms 18424 KB Output is correct
30 Correct 20 ms 18552 KB Output is correct
31 Correct 25 ms 18424 KB Output is correct
32 Correct 20 ms 18424 KB Output is correct
33 Correct 24 ms 18428 KB Output is correct
34 Correct 19 ms 18424 KB Output is correct
35 Correct 19 ms 18444 KB Output is correct
36 Correct 19 ms 18424 KB Output is correct
37 Correct 20 ms 18428 KB Output is correct
38 Correct 20 ms 18424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 18424 KB Output is correct
2 Correct 18 ms 18428 KB Output is correct
3 Correct 19 ms 18296 KB Output is correct
4 Correct 18 ms 18424 KB Output is correct
5 Correct 18 ms 18296 KB Output is correct
6 Correct 18 ms 18424 KB Output is correct
7 Correct 18 ms 18296 KB Output is correct
8 Correct 18 ms 18296 KB Output is correct
9 Correct 19 ms 18424 KB Output is correct
10 Correct 18 ms 18424 KB Output is correct
11 Correct 18 ms 18428 KB Output is correct
12 Correct 18 ms 18428 KB Output is correct
13 Correct 18 ms 18396 KB Output is correct
14 Correct 18 ms 18296 KB Output is correct
15 Correct 19 ms 18296 KB Output is correct
16 Correct 18 ms 18300 KB Output is correct
17 Correct 18 ms 18424 KB Output is correct
18 Correct 19 ms 18424 KB Output is correct
19 Correct 347 ms 28132 KB Output is correct
20 Correct 346 ms 28008 KB Output is correct
21 Correct 449 ms 28344 KB Output is correct
22 Correct 580 ms 29048 KB Output is correct
23 Correct 196 ms 27868 KB Output is correct
24 Correct 163 ms 27384 KB Output is correct
25 Correct 300 ms 30896 KB Output is correct
26 Correct 192 ms 33628 KB Output is correct
27 Correct 1233 ms 38188 KB Output is correct
28 Correct 645 ms 47864 KB Output is correct
29 Correct 669 ms 46932 KB Output is correct
30 Correct 1192 ms 38060 KB Output is correct
31 Correct 1219 ms 38116 KB Output is correct
32 Correct 1412 ms 37996 KB Output is correct
33 Correct 584 ms 37944 KB Output is correct
34 Correct 543 ms 38032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 18424 KB Output is correct
2 Correct 18 ms 18428 KB Output is correct
3 Correct 19 ms 18296 KB Output is correct
4 Correct 18 ms 18424 KB Output is correct
5 Correct 18 ms 18296 KB Output is correct
6 Correct 18 ms 18424 KB Output is correct
7 Correct 18 ms 18296 KB Output is correct
8 Correct 18 ms 18296 KB Output is correct
9 Correct 19 ms 18424 KB Output is correct
10 Correct 18 ms 18424 KB Output is correct
11 Correct 18 ms 18428 KB Output is correct
12 Correct 18 ms 18428 KB Output is correct
13 Correct 18 ms 18396 KB Output is correct
14 Correct 18 ms 18296 KB Output is correct
15 Correct 19 ms 18296 KB Output is correct
16 Correct 18 ms 18300 KB Output is correct
17 Correct 18 ms 18424 KB Output is correct
18 Correct 19 ms 18424 KB Output is correct
19 Correct 18 ms 18300 KB Output is correct
20 Correct 18 ms 18296 KB Output is correct
21 Correct 20 ms 18424 KB Output is correct
22 Correct 19 ms 18488 KB Output is correct
23 Correct 19 ms 18428 KB Output is correct
24 Correct 20 ms 18424 KB Output is correct
25 Correct 20 ms 18424 KB Output is correct
26 Correct 19 ms 18424 KB Output is correct
27 Correct 19 ms 18424 KB Output is correct
28 Correct 23 ms 18424 KB Output is correct
29 Correct 21 ms 18424 KB Output is correct
30 Correct 20 ms 18552 KB Output is correct
31 Correct 25 ms 18424 KB Output is correct
32 Correct 20 ms 18424 KB Output is correct
33 Correct 24 ms 18428 KB Output is correct
34 Correct 19 ms 18424 KB Output is correct
35 Correct 19 ms 18444 KB Output is correct
36 Correct 19 ms 18424 KB Output is correct
37 Correct 20 ms 18428 KB Output is correct
38 Correct 20 ms 18424 KB Output is correct
39 Correct 347 ms 28132 KB Output is correct
40 Correct 346 ms 28008 KB Output is correct
41 Correct 449 ms 28344 KB Output is correct
42 Correct 580 ms 29048 KB Output is correct
43 Correct 196 ms 27868 KB Output is correct
44 Correct 163 ms 27384 KB Output is correct
45 Correct 300 ms 30896 KB Output is correct
46 Correct 192 ms 33628 KB Output is correct
47 Correct 1233 ms 38188 KB Output is correct
48 Correct 645 ms 47864 KB Output is correct
49 Correct 669 ms 46932 KB Output is correct
50 Correct 1192 ms 38060 KB Output is correct
51 Correct 1219 ms 38116 KB Output is correct
52 Correct 1412 ms 37996 KB Output is correct
53 Correct 584 ms 37944 KB Output is correct
54 Correct 543 ms 38032 KB Output is correct
55 Correct 46 ms 19488 KB Output is correct
56 Correct 41 ms 19576 KB Output is correct
57 Correct 173 ms 29012 KB Output is correct
58 Execution timed out 3045 ms 28652 KB Time limit exceeded
59 Halted 0 ms 0 KB -