QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#398599#7509. 01treeluanmengleiTL 51ms11992kbC++172.7kb2024-04-25 15:34:092024-04-25 15:34:11

Judging History

你现在查看的是最新测评结果

  • [2024-04-25 15:34:11]
  • 评测
  • 测评结果:TL
  • 用时:51ms
  • 内存:11992kb
  • [2024-04-25 15:34:09]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

namespace SOL {

using i64 = long long;
void debug(const char *msg, ...) {
#ifdef CLESIP
    va_list arg;
    static char pbString[512];
    va_start(arg,msg);
    vsprintf(pbString,msg,arg);
    cerr << "[DEBUG] " << pbString << "\n";
    va_end(arg);
#endif    
}
template<typename T, typename L>
bool chkmax(T &x, L y) { if (x < y) return x = y, true; return false; }
template<typename T, typename L>
bool chkmin(T &x, L y) { if (y < x) return x = y, true; return false; }

const int N = 2e5 + 10;
const i64 P = 1e9 + 7;
int n, dep[N], asum[2], acnt[2];
i64 fac[N], inv[N], ans;
char s[N], t[N];
vector<int> G[N];

void init() {
	fac[0] = inv[0] = inv[1] = 1;
	for (int i = 1; i < N; i ++)
		fac[i] = fac[i - 1] * i % P;
	for (int i = 2; i < N; i ++)
		inv[i] = (P - P / i) * inv[P % i] % P;
	for (int i = 1; i < N; i ++)
		inv[i] = inv[i - 1] * inv[i] % P;
}

void mod(i64 &x, i64 y) {
	x += y;
	if (x >= P)
		x -= P;
}

i64 binom(int n, int m) {
	if (n < m || m < 0)
		return 0;
	return fac[n] * inv[m] % P * inv[n - m] % P;
}

char flip(char ch) {
	if (ch == '?')
		return '?';
	if (ch == '0')
		return '1';
	return '0';
}

int sum[2][N], cnt[2][N];

void flip_dfs(int x, int fa) {
	dep[x] = dep[fa] + 1;
	if (dep[x] & 1) {
		s[x] = flip(s[x]);
		t[x] = flip(t[x]);
	}
	for (int y : G[x]) if (y != fa)
		flip_dfs(y, x);
}

void dfs(int x, int fa) {
	for (int i = 0; i < 2; i ++)
		sum[i][x] = cnt[i][x] = 0;
	sum[0][x] += (s[x] == '1'), sum[1][x] += (t[x] == '1');
	cnt[0][x] += (s[x] == '?'), cnt[1][x] += (t[x] == '?');
	for (int y : G[x]) if (y != fa) {
		dfs(y, x);
		for (int i = 0; i < 2; i ++)
			sum[i][x] += sum[i][y], cnt[i][x] += cnt[i][y];
	}
	int s1 = cnt[0][x], t1 = cnt[1][x];
	int ssum = asum[0], tsum = asum[1];
	int s0 = acnt[0] - s1, t0 = acnt[1] - t1;
	// debug("x: %d (%d, %d) (%d, %d)", x, sum[0][x], sum[1][x], cnt[0][x], cnt[1][x]);
	for (int d = -n; d <= n; d ++) {
		mod(ans, abs(sum[0][x] - sum[1][x] - d) * binom(s1 + t1, s1 + d) % P * binom(s0 + t0, tsum - ssum + d + t0) % P);
	} 	
}

void solve() {
	cin >> n;
	ans = 0;
	for (int i = 1; i <= n; i ++)
		G[i].clear();
	for (int i = 1, x, y; i < n; i ++) {
		cin >> x >> y;
		G[x].push_back(y), G[y].push_back(x);
	}
	cin >> (s + 1) >> (t + 1);
	for (int i = 0; i < 2; i ++)
		asum[i] = acnt[i] = 0;
	flip_dfs(1, 0);
	for (int i = 1; i <= n; i ++) {
		asum[0] += (s[i] == '1'), asum[1] += (t[i] == '1');
		acnt[0] += (s[i] == '?'), acnt[1] += (t[i] == '?');
	}
	dfs(1, 0);
	cout << ans << "\n";
}

}
int main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	SOL::init();
	int tt; cin >> tt;
	while (tt --)
		SOL::solve();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 11516kb

input:

3
2
1 2
00
11
3
1 2
2 3
???
???
3
1 2
2 3
??1
0?0

output:

1
16
1

result:

ok 3 number(s): "1 16 1"

Test #2:

score: 0
Accepted
time: 11ms
memory: 11440kb

input:

1000
23
1 2
1 3
1 4
2 5
5 6
4 7
3 8
4 9
8 10
8 11
8 12
1 13
7 14
10 15
7 16
7 17
5 18
18 19
12 20
9 21
21 22
6 23
00?10?0000??1?00111?010
011??1?10?01?110?0??101
6
1 2
1 3
1 4
4 5
3 6
000?10
1???01
25
1 2
2 3
2 4
4 5
5 6
2 7
4 8
5 9
7 10
8 11
11 12
5 13
11 14
3 15
6 16
14 17
1 18
4 19
6 20
4 21
5 22...

output:

53545
24
11724
2228
162
14
711
28
550
1680
52
2
13
988
9480
2342
626416
0
71780
1
88
39207
19448
4
37395
9602
3253496
38057200
1066
3
303732
1608
281022
11718
170
78
15
1219376
29364
9092
7
0
2
7014
1942448
170371
75845
167217
16554
64
904
564290
14822
1127090
1758504
1227646
14833316
14954550
36055...

result:

ok 1000 numbers

Test #3:

score: 0
Accepted
time: 51ms
memory: 11716kb

input:

1
3000
1 2
2 3
2 4
1 5
3 6
2 7
5 8
8 9
9 10
10 11
2 12
11 13
7 14
11 15
7 16
13 17
8 18
1 19
11 20
10 21
18 22
7 23
7 24
15 25
23 26
24 27
14 28
15 29
25 30
16 31
6 32
10 33
3 34
30 35
16 36
9 37
36 38
28 39
26 40
33 41
1 42
11 43
20 44
23 45
14 46
31 47
41 48
11 49
48 50
45 51
6 52
10 53
32 54
38 5...

output:

924036898

result:

ok 1 number(s): "924036898"

Test #4:

score: 0
Accepted
time: 48ms
memory: 11716kb

input:

1
3000
1 2
1 3
2 4
2 5
3 6
3 7
4 8
4 9
5 10
5 11
6 12
6 13
7 14
7 15
8 16
8 17
9 18
9 19
10 20
10 21
11 22
11 23
12 24
12 25
13 26
13 27
14 28
14 29
15 30
15 31
16 32
16 33
17 34
17 35
18 36
18 37
19 38
19 39
20 40
20 41
21 42
21 43
22 44
22 45
23 46
23 47
24 48
24 49
25 50
25 51
26 52
26 53
27 54
2...

output:

429465738

result:

ok 1 number(s): "429465738"

Test #5:

score: 0
Accepted
time: 45ms
memory: 11992kb

input:

1
3000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
51 52
52 5...

output:

650625747

result:

ok 1 number(s): "650625747"

Test #6:

score: -100
Time Limit Exceeded

input:

1
100000
1 2
1 3
3 4
1 5
2 6
6 7
2 8
1 9
6 10
1 11
3 12
11 13
5 14
9 15
12 16
6 17
13 18
13 19
14 20
7 21
14 22
21 23
12 24
17 25
14 26
3 27
4 28
8 29
22 30
12 31
6 32
30 33
4 34
15 35
12 36
3 37
20 38
7 39
37 40
5 41
13 42
34 43
9 44
27 45
39 46
43 47
3 48
17 49
36 50
12 51
1 52
45 53
35 54
15 55
2...

output:


result: