QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#188947#7509. 01treezhoukangyang#AC ✓38ms44976kbC++113.7kb2023-09-26 17:40:282023-09-26 17:40:29

Judging History

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

  • [2023-09-26 17:40:29]
  • 评测
  • 测评结果:AC
  • 用时:38ms
  • 内存:44976kb
  • [2023-09-26 17:40:28]
  • 提交

answer

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define ll long long 
#define vi vector < int > 
#define sz(a) ((int) (a).size())
#define ll long long 
#define ull unsigned long long
#define me(a, x) memset(a, x, sizeof(a)) 
using namespace std;
const int N = 1 << 19, mod = 1e9 + 7;

int qpow(int x, int y = mod - 2) {
	int res = 1;
	for(; y; x = (ll) x * x % mod, y >>= 1) if(y & 1) res = (ll) res * x % mod;
	return res;
}
int fac[N], ifac[N], inv[N];
void init(int x) {
	fac[0] = ifac[0] = inv[1] = 1;
	L(i, 2, x) inv[i] = (ll) (mod - mod / i) * inv[mod % i] % mod;
	L(i, 1, x) fac[i] = (ll) fac[i - 1] * i % mod, ifac[i] = (ll) ifac[i - 1] * inv[i] % mod;
} 
int C(int x, int y) {
	return x < y || y < 0 ? 0 : (ll) fac[x] * ifac[y] % mod * ifac[x - y] % mod;
}

int n;
char s[N], t[N];
vi e[N];

int scnt[N], snon[N];
int tcnt[N], tnon[N];
int col[N];
void dfs(int x, int fa) {
	if(col[x]) {
		if(s[x] != '?') 
			s[x] ^= 1;
		if(t[x] != '?') 
			t[x] ^= 1;
	} 
	scnt[x] = s[x] == '1';
	snon[x] = s[x] == '?';
	
	tcnt[x] = t[x] == '1';
	tnon[x] = t[x] == '?';
	for(auto v : e[x]) if(v != fa) {
		col[v] = col[x] ^ 1, dfs(v, x);
		scnt[x] += scnt[v];
		snon[x] += snon[v];
		
		tcnt[x] += tcnt[v];
		tnon[x] += tnon[v];
	}
}

struct node {
	int L, D;
} ask[N];
int top;

int B;

struct Q {
	int pn, all;
	int L, D;
	int ans1;
	inline void recalc() {
		ans1 = 0;
		L(a, 0, D) 
			(ans1 += (ll) C(L, a) * C(all - L, pn - a) % mod) %= mod;
	}
	Q(int P = 0, int A = 0) {
		pn = P, all = A; 
		L = 0, D = 0;
		recalc();
	}
	void move(int l, int d) {
		while(L < l) {
			(ans1 += mod - (ll) C(L, D) * C(all - L - 1, pn - D - 1) % mod) %= mod;
			++L;
			if(L == 0) recalc();
		}
		while(L > l) {
			--L;
			if(L < 0) recalc();
			(ans1 += (ll) C(L, D) * C(all - L - 1, pn - D - 1) % mod) %= mod;
		}
		while(D < d) {
			++D;
			(ans1 += (ll) C(L, D) * C(all - L, pn - D) % mod) %= mod;
		}
		while(D > d) {
			(ans1 += mod - (ll) C(L, D) * C(all - L, pn - D) % mod) %= mod;
			--D;
		}
	}
} CUR1, CUR2;

void Main() {
	cin >> n;
	B = sqrt(n);
	L(i, 1, n - 1) {
		int u, v;
		cin >> u >> v;
		e[u].emplace_back(v);
		e[v].emplace_back(u);
	}
	cin >> (s + 1) >> (t + 1);
	col[1] = 0, dfs(1, 0);
	
	int ans = 0;
	
	int pn = tnon[1] + tcnt[1] - scnt[1];
	int all = snon[1] + tnon[1];
	
	top = 0;
	L(i, 2, n) {
		int sx = snon[i]; 
		int sy = snon[1] - snon[i];
		
		int tx = tnon[i]; 
		int ty = tnon[1] - tnon[i];
		
		int L = sx + tx, R = sy + ty, D = tx + tcnt[i] - scnt[i];
		++top;
		ask[top].L = L;
		ask[top].D = D;
	}
	sort(ask + 1, ask + top + 1, [&] (node a, node b) {
		return a.L / B == b.L / B ? a.D < b.D : a.L < b.L;
	});
	
	CUR1 = Q(pn, all);
	CUR2 = Q(pn - 1, all - 1);
	L(i, 1, top) {
		int L = ask[i].L, D = ask[i].D;
		
		if(L < 0 || L > all) continue;
		(ans += (ll) (mod - D) * C(all, pn) % mod) %= mod;
		(ans += (ll) L * C(all - 1, pn - 1) % mod) %= mod;
		
		CUR1.move(L, D);
		CUR2.move(L - 1, D - 1);
		(ans += (ll) CUR1.ans1 * (D + mod) * 2 % mod) %= mod;
		(ans += (ll) CUR2.ans1 * (mod - L * 2) % mod) %= mod;
		
//		L(a, 0, D) {
//			(ans += (ll) C(L, a) * C(all - L, pn - a) % mod * D * 2 % mod) %= mod;
//		}
//		L(a, 0, D - 1) {
//			(ans += (ll) C(L - 1, a) * C(all - L, pn - a - 1) % mod * (mod - L * 2) % mod) %= mod;
//		}

//		CUR.move(L, D);
//		(ans += CUR.ans2) %= mod;
	}
	
	cout << ans << '\n';
	
	L(i, 1, n) {
		e[i].clear();
	}
}

int main() {
	init(2e5 + 7);
	ios :: sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t; cin >> t; while(t--) Main();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 29788kb

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: 8ms
memory: 30588kb

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: 0ms
memory: 30140kb

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: 3ms
memory: 30460kb

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: 4ms
memory: 32196kb

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: 0
Accepted
time: 36ms
memory: 35888kb

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:

143309878

result:

ok 1 number(s): "143309878"

Test #7:

score: 0
Accepted
time: 37ms
memory: 37308kb

input:

1
100000
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...

output:

724432513

result:

ok 1 number(s): "724432513"

Test #8:

score: 0
Accepted
time: 34ms
memory: 44976kb

input:

1
100000
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...

output:

164448583

result:

ok 1 number(s): "164448583"

Test #9:

score: 0
Accepted
time: 38ms
memory: 33832kb

input:

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

output:

159386883

result:

ok 1 number(s): "159386883"

Test #10:

score: 0
Accepted
time: 23ms
memory: 35752kb

input:

1
100000
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...

output:

752214506

result:

ok 1 number(s): "752214506"

Test #11:

score: 0
Accepted
time: 18ms
memory: 44872kb

input:

1
100000
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...

output:

419022702

result:

ok 1 number(s): "419022702"