Particle

競技プログラミングについての雑記

SRM 666 Div1 Easy WalkOverATree

頂点 0 まで戻ってくる場合の問題について考える。
すると、無駄な探索をしなければ、L/2+1 個の頂点に到達することができる。
頂点 0 まで戻る必要が無い場合には、深さが最大となる頂点までの距離の分 (すなわち深さの最大値) だけ移動距離を増やせるため、L' = L+ max{depth} として、L'/2+1 個の頂点に到達できる。
頂点数が L に対して小さいときは、頂点数との min を取ることを忘れないことに注意する。

#define N 60
int d[N];

class WalkOverATree {
	public:
	int maxNodesVisited(vector <int> p, int L) {
		int m = p.size();
		rep(i, m) d[i+1] = d[p[i]]+1;
		int mx = 0;
		rep(i, m+1) chmax(mx, d[i]);
		if(mx>=L) return min(m+1, L+1);
		return min(m+1, (L+mx)/2+1);
	}
};