1153D - Serval and Rooted Tree - CodeForces Solution


binary search dfs and similar dp greedy trees *1900

Please click on ads to support us..

C++ Code:

//dp[i]:if Max v is w, then need w + dp[i]
#include <iostream>
#include <cstring>

using namespace std;

const int N = 3e5 + 10; 

int n, leaf;
int fa[N], dp[N], m[N];
int h[N], e[N], ne[N], idx;

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dfs(int x) {
	for (int i = h[x]; ~i; i = ne[i]) {
		int j = e[i];
		dfs(j);
	}
	if (h[x] == -1) dp[x] = 0, leaf ++;
	else {
		if (m[x]) {
			dp[x] = 998244353;
			for (int i = h[x]; ~i; i = ne[i]) dp[x] = min(dp[x], dp[e[i]]);
		}
		else {
			for (int i = h[x]; ~i; i = ne[i]) dp[x] += dp[e[i]] + 1;
			dp[x] --;
		}
	}
}

int main() {
	memset(h, -1, sizeof h);
	
	scanf("%d", &n);
	
	for (int i = 1; i <= n; i ++) scanf("%d", &m[i]);
	
	for (int i = 2; i <= n; i ++) {
		scanf("%d", &fa[i]);
		add(fa[i], i);
	}
	
	dfs(1);
	
	printf("%d", leaf - dp[1]);
	
	return 0;
}
	   		  	  	   	 	  		  						


Comments

Submit
0 Comments
More Questions

1157E - Minimum Array
1661D - Progressions Covering
262A - Roma and Lucky Numbers
1634B - Fortune Telling
1358A - Park Lighting
253C - Text Editor
365B - The Fibonacci Segment
75A - Life Without Zeros
1519A - Red and Blue Beans
466A - Cheap Travel
659E - New Reform
1385B - Restore the Permutation by Merger
706A - Beru-taxi
686A - Free Ice Cream
1358D - The Best Vacation
1620B - Triangles on a Rectangle
999C - Alphabetic Removals
1634C - OKEA
1368C - Even Picture
1505F - Math
1473A - Replacing Elements
959A - Mahmoud and Ehab and the even-odd game
78B - Easter Eggs
1455B - Jumps
1225C - p-binary
1525D - Armchairs
1257A - Two Rival Students
1415A - Prison Break
1271A - Suits
259B - Little Elephant and Magic Square