Submission details
Task:Tree matching
Sender:HopeICanCode
Submission time:2016-09-24 15:13:52 +0300
Language:C++
Status:READY
Result:
Test results
testverdicttime
#10.05 sdetails
#2--details
#3--details
#4--details
#5--details
#6--details
#7--details

Code

#include <bits/stdc++.h>
#define UNVISITED -1
#define BIGINT 1 << 25
#define _ ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0), cout.precision(15);
using namespace std;

typedef long long int64;
typedef pair<int, int> ii;

const int MOD = 1000000007;
vector<int64> comb;	// total combination, combination when combines neither child
vector< vector<int> > child;

int64 solve(int u){
	if(u == 0)	return 1;
	if(comb[u] != -1)	return comb[u];

	comb[u] = 0;
	int left = child[u][0],	right = child[u][1], nComb = 0;
	
	
	if(left != 0 && right != 0){
		// don't connect either child
		nComb = solve(left) * solve(right);
		comb[u] = (comb[u] + nComb) % MOD;
	
		// only connect right child, then we can at most connect left grand child
		nComb = solve(child[left][0]) * solve(child[left][1]) * solve(right);
		comb[u] = (comb[u] + nComb) % MOD;
	
		// connect left child
		nComb = solve(left) * solve(child[right][0]) * solve(child[right][1]);
		comb[u] = (comb[u] + nComb) % MOD;
	} else if(left != 0){
		// don't connect left
		nComb = solve(left);
		comb[u] = (comb[u] + nComb) % MOD;
		
		// connect left
		nComb = solve(child[left][0]) * solve(child[left][1]);
		comb[u] = (comb[u] + nComb) % MOD;
	} else if(right != 0){
		// don't connect right
		nComb = solve(right);
		comb[u] = (comb[u] + nComb) % MOD;
		
		// connect left
		nComb = solve(child[right][0]) * solve(child[right][1]);
		comb[u] = (comb[u] + nComb) % MOD;
	} else {
		comb[u] = 1;
	}
	
	return comb[u];
}


int main(){ _
	int n;	cin >> n;
	comb.assign(n+1, (int64)UNVISITED);
	child.assign(n+1, vector<int> (2, 0));
	for(int i = 1; i <= n; ++i)
		cin >> child[i][0] >> child[i][1];
	
	for(int i = 0; i <= n; ++i)
		cout << i << ": " << solve(i) << endl;
	
    return 0;
}

Test details

Test 1

Verdict:

input
7
5 6
0 0
4 0
2 0
...

correct output
19

user output
0: 1
1: 19
2: 1
3: 3
4: 2
...

Test 2

Verdict:

input
1000000
406968 281253
108264 0
0 0
0 0
...

correct output
159944844

user output
(empty)

Test 3

Verdict:

input
1000000
1000000 325587
791377 324030
873422 0
0 0
...

correct output
114625606

user output
(empty)

Test 4

Verdict:

input
1000000
495129 959931
0 703069
862854 0
0 423221
...

correct output
922109659

user output
(empty)

Test 5

Verdict:

input
1000000
667150 768657
0 528730
716704 103616
554625 0
...

correct output
331516797

user output
(empty)

Test 6

Verdict:

input
1000000
490726 891332
0 988621
0 469251
224815 393797
...

correct output
831971669

user output
(empty)

Test 7

Verdict:

input
1000000
554662 668
0 0
0 0
0 806138
...

correct output
593438800

user output
(empty)