462D - Appleman and Tree - CodeForces Solution


dp graphs *2000

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5, MOD=1e9+7;
vector<int> sons[MAXN];
int col[MAXN], f[MAXN], g[MAXN], n;
int main()
{
	cin >> n;
	for (int i=1; i<n; i++)
	{
		int x;
		cin >> x;
		sons[x].push_back(i);
	}
	for (int i=0; i<n; i++) cin >> col[i];
	int sufs[MAXN], pres[MAXN];
	for (int i=n-1; i>=0; i--)
	{
		int m = sons[i].size();
		pres[0] = 1;
		for (int j=0; j<m; j++) pres[j+1] = (long long)pres[j] * f[sons[i][j]] % MOD;
		sufs[m] = 1;
		for (int j=m-1; j>=0; j--) sufs[j] = (long long)sufs[j+1] * f[sons[i][j]] % MOD;
		f[i] = pres[m];
		for (int j=0; j<m; j++) g[i] = (g[i] + (long long)pres[j] * g[sons[i][j]] % MOD * sufs[j+1]) % MOD;
		if (col[i]) g[i] = f[i], f[i] = 0;
		f[i] = (f[i] + g[i]) % MOD;
	}
	cout << g[0] << "\n";
}


Comments

Submit
0 Comments
More Questions

432A - Choosing Teams
758A - Holiday Of Equality
1650C - Weight of the System of Nested Segments
1097A - Gennady and a Card Game
248A - Cupboards
1641A - Great Sequence
1537A - Arithmetic Array
1370A - Maximum GCD
149A - Business trip
34A - Reconnaissance 2
59A - Word
462B - Appleman and Card Game
1560C - Infinity Table
1605C - Dominant Character
1399A - Remove Smallest
208A - Dubstep
1581A - CQXYM Count Permutations
337A - Puzzles
495A - Digital Counter
796A - Buying A House
67A - Partial Teacher
116A - Tram
1472B - Fair Division
1281C - Cut and Paste
141A - Amusing Joke
112A - Petya and Strings
677A - Vanya and Fence
1621A - Stable Arrangement of Rooks
472A - Design Tutorial Learn from Math
1368A - C+=