CSES - E4590 2018 2 - Results
Submission details
Task:Tree matching
Sender:Pohjantahti
Submission time:2018-09-22 14:49:03 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.29 sdetails
#3ACCEPTED0.30 sdetails
#4ACCEPTED0.29 sdetails
#5ACCEPTED0.31 sdetails
#6ACCEPTED0.30 sdetails
#7ACCEPTED0.30 sdetails

Code

#include <iostream>
#include <vector>

using namespace std;
typedef long long ll;

const int N = 1000000;
const ll M = 1000000007;


int n;
int g[2][N+5];
ll dp[2][N+5];

void dfs(int s) {
	int cl = g[0][s];
	int cr = g[1][s];
	if (cl != 0) {
		dfs(cl);
	}
	if (cr != 0) {
		dfs(cr);
	}
	if (cl == 0 && cr == 0) {
		dp[0][s] = 1;
	}
	else if (cl == 0) {
		dp[0][s] = (dp[0][cr]+dp[1][cr])%M;
		dp[1][s] = dp[0][cr];
	}
	else if (cr == 0) {
		dp[0][s] = (dp[0][cl]+dp[1][cl])%M;
		dp[1][s] = dp[0][cl];
	}
	else {
		dp[0][s] = ((dp[0][cl]+dp[1][cl])*(dp[0][cr]+dp[1][cr]))%M;
		dp[1][s] = ((dp[0][cl] * (dp[0][cr]+dp[1][cr])) + ((dp[0][cl]+dp[1][cl]) * dp[0][cr]))%M;
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> g[0][i] >> g[1][i];
	}
	dfs(1);
	cout << ((dp[0][1] + dp[1][1])%M) << "\n";
	return 0;
}

Test details

Test 1

Verdict: ACCEPTED

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

correct output
19

user output
19

Test 2

Verdict: ACCEPTED

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

correct output
159944844

user output
159944844

Test 3

Verdict: ACCEPTED

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

correct output
114625606

user output
114625606

Test 4

Verdict: ACCEPTED

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

correct output
922109659

user output
922109659

Test 5

Verdict: ACCEPTED

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

correct output
331516797

user output
331516797

Test 6

Verdict: ACCEPTED

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

correct output
831971669

user output
831971669

Test 7

Verdict: ACCEPTED

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

correct output
593438800

user output
593438800