Submission #917711

# Submission time Handle Problem Language Result Execution time Memory
917711 2024-01-28T16:31:08 Z dsyz Cat in a tree (BOI17_catinatree) C++17
100 / 100
531 ms 136512 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define MAXN (200005)
ll N,D;
vector<pair<ll,ll> > sortbydepth;
vector<pair<ll,ll> > DIST[MAXN];
vector<pair<ll,ll> > v[MAXN];
ll sub[MAXN], par[MAXN], lvl[MAXN], dist[MAXN][20], m[MAXN];
bool cannot[MAXN];
void calcdepth(ll x,ll p,ll level){
	sortbydepth.push_back({level,x});
	for(auto u : v[x]){
		if(u.first != p){
			calcdepth(u.first,x,level + 1);
		}
	}
}
ll dfs1(ll x,ll p,ll l){
	sub[x] = 1;
	for(auto u : v[x]){
		if(u.first != p && lvl[u.first] == -1){ //unvisited
			sub[x] += dfs1(u.first,x,l);
		}
	}
	return sub[x];
}
ll dfs2(ll x,ll p,ll siz){ //siz is total size of this centroid tree 
	for(auto u : v[x]){
		if(u.first != p && lvl[u.first] == -1 && sub[u.first] > siz / 2){
			return dfs2(u.first,x,siz); //remember that siz remains constant
		}
	}
	return x;
}
void dfsdist(ll x,ll p,ll centroid,ll curlvl,ll curdist){
	dist[x][curlvl] = curdist;
	DIST[centroid].push_back({curdist,x});
	for(auto u : v[x]){
		if(u.first != p && lvl[u.first] == -1){ //unvisited
			dfsdist(u.first,x,centroid,curlvl,curdist + u.second);
			//Note: curlvl is unchanged since we are moving down so
			//the relative lvl has already changed
		}
	}
}
void build(ll x,ll p,ll l){
	ll siz = dfs1(x,p,l);
	ll cent = dfs2(x,p,siz);
	if(p == -1) p = cent;
	par[cent] = p;
	lvl[cent] = l;
	dfsdist(cent,-1,cent,l,0);
	sort(DIST[cent].begin(),DIST[cent].end(),greater<pair<ll,ll> >());
	for(auto u : v[cent]){
		if(lvl[u.first] == -1){ //unvisited
			build(u.first,cent,l + 1);
		}
	}
}
int main() {
	ios_base::sync_with_stdio(false);cin.tie(0);
	cin>>N>>D;
	for(ll i = 1;i < N;i++){
		ll p;
		cin>>p;
		v[p].push_back({i,1});
		v[i].push_back({p,1});
	}
	calcdepth(0,-1,0);
	sort(sortbydepth.begin(),sortbydepth.end(),greater<pair<ll,ll> >());
	for(ll i = 0;i < MAXN;i++){
		for(ll j = 0;j < 20;j++){
			dist[i][j] = 1e18;
		}
	}
	memset(lvl,-1,sizeof(lvl)); //need lvl to find dist[i][lvl]
	build(0,-1,0);
	for(ll i = 0;i < MAXN;i++){
		m[i] = 1e18;
	}
	ll ans = 0;
	for(auto u : sortbydepth){
		if(cannot[u.second]) continue;
		ll x = u.second;
		while(true){
			ll distjumped = dist[u.second][lvl[x]];
			while(!DIST[x].empty()){
				if(DIST[x].back().first + distjumped < D){ //node DIST[x].back().second cannot be picked as distance < D from a node that is already selected, we can greedily prove that it is not optimal to delete the selected node (with greater depth) and replace it with node DIST[x].back().second (with lower depth)
					cannot[DIST[x].back().second] = true;
					DIST[x].pop_back();
				}else{
					break;
				}
			}
			if(par[x] == x) break; //x is the root node in the centroid tree
			x = par[x]; //in the centroid tree, height is at most log2(N) so node x has at most log2(N) ancestors in total
		}
		ans++;
	}
	cout<<ans<<'\n';
}
# Verdict Execution time Memory Grader output
1 Correct 12 ms 47192 KB Output is correct
2 Correct 11 ms 47192 KB Output is correct
3 Correct 11 ms 47196 KB Output is correct
4 Correct 11 ms 47452 KB Output is correct
5 Correct 10 ms 47196 KB Output is correct
6 Correct 11 ms 47448 KB Output is correct
7 Correct 10 ms 47196 KB Output is correct
8 Correct 11 ms 47376 KB Output is correct
9 Correct 10 ms 47436 KB Output is correct
10 Correct 11 ms 47412 KB Output is correct
11 Correct 11 ms 47452 KB Output is correct
12 Correct 11 ms 47372 KB Output is correct
13 Correct 11 ms 47448 KB Output is correct
14 Correct 10 ms 47388 KB Output is correct
15 Correct 11 ms 47452 KB Output is correct
16 Correct 12 ms 47452 KB Output is correct
17 Correct 11 ms 47452 KB Output is correct
18 Correct 12 ms 47448 KB Output is correct
19 Correct 11 ms 47452 KB Output is correct
20 Correct 12 ms 47440 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 47192 KB Output is correct
2 Correct 11 ms 47192 KB Output is correct
3 Correct 11 ms 47196 KB Output is correct
4 Correct 11 ms 47452 KB Output is correct
5 Correct 10 ms 47196 KB Output is correct
6 Correct 11 ms 47448 KB Output is correct
7 Correct 10 ms 47196 KB Output is correct
8 Correct 11 ms 47376 KB Output is correct
9 Correct 10 ms 47436 KB Output is correct
10 Correct 11 ms 47412 KB Output is correct
11 Correct 11 ms 47452 KB Output is correct
12 Correct 11 ms 47372 KB Output is correct
13 Correct 11 ms 47448 KB Output is correct
14 Correct 10 ms 47388 KB Output is correct
15 Correct 11 ms 47452 KB Output is correct
16 Correct 12 ms 47452 KB Output is correct
17 Correct 11 ms 47452 KB Output is correct
18 Correct 12 ms 47448 KB Output is correct
19 Correct 11 ms 47452 KB Output is correct
20 Correct 12 ms 47440 KB Output is correct
21 Correct 13 ms 47964 KB Output is correct
22 Correct 12 ms 47448 KB Output is correct
23 Correct 11 ms 47452 KB Output is correct
24 Correct 11 ms 47452 KB Output is correct
25 Correct 14 ms 47496 KB Output is correct
26 Correct 14 ms 47408 KB Output is correct
27 Correct 12 ms 47452 KB Output is correct
28 Correct 12 ms 47708 KB Output is correct
29 Correct 12 ms 47768 KB Output is correct
30 Correct 12 ms 47564 KB Output is correct
31 Correct 12 ms 47708 KB Output is correct
32 Correct 11 ms 47708 KB Output is correct
33 Correct 12 ms 47708 KB Output is correct
34 Correct 12 ms 47708 KB Output is correct
35 Correct 11 ms 47452 KB Output is correct
36 Correct 12 ms 47704 KB Output is correct
37 Correct 11 ms 47708 KB Output is correct
38 Correct 12 ms 47708 KB Output is correct
39 Correct 12 ms 47708 KB Output is correct
40 Correct 14 ms 47960 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 47192 KB Output is correct
2 Correct 11 ms 47192 KB Output is correct
3 Correct 11 ms 47196 KB Output is correct
4 Correct 11 ms 47452 KB Output is correct
5 Correct 10 ms 47196 KB Output is correct
6 Correct 11 ms 47448 KB Output is correct
7 Correct 10 ms 47196 KB Output is correct
8 Correct 11 ms 47376 KB Output is correct
9 Correct 10 ms 47436 KB Output is correct
10 Correct 11 ms 47412 KB Output is correct
11 Correct 11 ms 47452 KB Output is correct
12 Correct 11 ms 47372 KB Output is correct
13 Correct 11 ms 47448 KB Output is correct
14 Correct 10 ms 47388 KB Output is correct
15 Correct 11 ms 47452 KB Output is correct
16 Correct 12 ms 47452 KB Output is correct
17 Correct 11 ms 47452 KB Output is correct
18 Correct 12 ms 47448 KB Output is correct
19 Correct 11 ms 47452 KB Output is correct
20 Correct 12 ms 47440 KB Output is correct
21 Correct 13 ms 47964 KB Output is correct
22 Correct 12 ms 47448 KB Output is correct
23 Correct 11 ms 47452 KB Output is correct
24 Correct 11 ms 47452 KB Output is correct
25 Correct 14 ms 47496 KB Output is correct
26 Correct 14 ms 47408 KB Output is correct
27 Correct 12 ms 47452 KB Output is correct
28 Correct 12 ms 47708 KB Output is correct
29 Correct 12 ms 47768 KB Output is correct
30 Correct 12 ms 47564 KB Output is correct
31 Correct 12 ms 47708 KB Output is correct
32 Correct 11 ms 47708 KB Output is correct
33 Correct 12 ms 47708 KB Output is correct
34 Correct 12 ms 47708 KB Output is correct
35 Correct 11 ms 47452 KB Output is correct
36 Correct 12 ms 47704 KB Output is correct
37 Correct 11 ms 47708 KB Output is correct
38 Correct 12 ms 47708 KB Output is correct
39 Correct 12 ms 47708 KB Output is correct
40 Correct 14 ms 47960 KB Output is correct
41 Correct 196 ms 74420 KB Output is correct
42 Correct 200 ms 74044 KB Output is correct
43 Correct 203 ms 74412 KB Output is correct
44 Correct 174 ms 74048 KB Output is correct
45 Correct 176 ms 73496 KB Output is correct
46 Correct 517 ms 100656 KB Output is correct
47 Correct 504 ms 101804 KB Output is correct
48 Correct 466 ms 103824 KB Output is correct
49 Correct 489 ms 104232 KB Output is correct
50 Correct 119 ms 68536 KB Output is correct
51 Correct 148 ms 68692 KB Output is correct
52 Correct 122 ms 68336 KB Output is correct
53 Correct 302 ms 91952 KB Output is correct
54 Correct 285 ms 89652 KB Output is correct
55 Correct 277 ms 90180 KB Output is correct
56 Correct 13 ms 48212 KB Output is correct
57 Correct 36 ms 56912 KB Output is correct
58 Correct 174 ms 93516 KB Output is correct
59 Correct 531 ms 136512 KB Output is correct
60 Correct 164 ms 76552 KB Output is correct
61 Correct 245 ms 92144 KB Output is correct