QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#609791#7509. 01treecjxTL 50ms14304kbC++203.3kb2024-10-04 14:02:092024-10-04 14:02:11

Judging History

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

  • [2024-10-04 14:02:11]
  • 评测
  • 测评结果:TL
  • 用时:50ms
  • 内存:14304kb
  • [2024-10-04 14:02:09]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
	long long x=0,f=1;char ch=getchar();
	while(!isdigit(ch))
	{if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=1e5+10;
const ll mod=1e9+7;
int tt,n;
int head[N],ver[N<<1],nxt[N<<1],tot; 
ll fac[N],inv[N],ans;
string s1,t1;
int s[N][3],t[N][3],dep[N],sz[N],son[N];
ll qmi(ll a,ll b){
	ll ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;b>>=1;
	}
	return ans;
}
void add(int x,int y){
	ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
void dfs1(int x,int fa){
	dep[x]=dep[fa]+1;
	if(dep[x]&1){
		if(s1[x-1]!='?')s1[x-1]='1'+'0'-s1[x-1];
		if(t1[x-1]!='?')t1[x-1]='1'+'0'-t1[x-1];
	}
	if(s1[x-1]=='?')s[x][2]=1;
	if(s1[x-1]=='1')s[x][1]=1;
	if(t1[x-1]=='?')t[x][2]=1;
	if(t1[x-1]=='1')t[x][1]=1;
	for(int i=head[x];i;i=nxt[i]){
		int y=ver[i];
		if(y==fa)continue;
		dfs1(y,x);sz[x]+=sz[y];
		s[x][1]+=s[y][1];
		s[x][2]+=s[y][2];
		t[x][1]+=t[y][1];
		t[x][2]+=t[y][2];
		if(son[x]==-1||sz[y]>sz[son[x]])son[x]=y;
	}
}
ll C(int n,int m){
	if(n<0||m<0||n<m)return 0;
	return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
bool cmp(int x,int y){
	return sz[x]>sz[y];
}
struct func{
	int P,Q,S,T;
	ll res;
	void init(){
		res=0;
		for(int i=0;i<=Q;i++)
			res=(res+C(P,i)*C(S-P,T-i)%mod)%mod;
	}
	void addp(ll op){
		res=(res+op*C(P,Q)*C(S-P-1,T-Q-1)%mod+mod)%mod;
	}
	void addq(ll op){
		res=(res+op*C(P,Q+1)*C(S-P,T-Q-1)%mod+mod)%mod;
	}
	void move(int p,int q){
		while(P<p)addp(-1),P++;
		while(P>p)P--,addp(1);
		while(Q<q)addq(1),Q++;
		while(Q>q)Q--,addq(-1);
	}
}f1[N],f2[N];
int lst;
void dfs2(int x,int fa){
	if(x>1){
		int A=s[x][2]+t[x][2];
		int B=s[x][2]+s[x][1]-t[x][1];
		if(!lst){
			f1[x].P=A;f1[x].Q=B-1;f1[x].S=s[1][2]+t[1][2];f1[x].T=s[1][2]+s[1][1]-t[1][1];
			f2[x].P=f1[x].P-1;f2[x].Q=f1[x].Q-1;f2[x].S=f1[x].S-1;f2[x].T=f1[x].T-1;
			f1[x].init();f2[x].init();
			//lst=x;
		}
		else{
			f1[x]=f1[lst];f2[x]=f2[lst];
			f1[x].move(A,B-1);
			f2[x].move(A-1,B-2);
		}
		//printf("%d %d %d\n",s[1][2],s[1][1],t[1][1]);
		//printf("x=%d A=%d B=%d S=%d T=%d\n",x,A,B,f1[x].S,f1[x].T);
		ans=(ans+B*f1[x].res%mod-A*f2[x].res%mod+mod)%mod;
	}
	if(son[x]!=-1)dfs2(son[x],x);
	for(int i=head[x];i;i=nxt[i]){
		int y=ver[i];
		if(y==fa||y==son[x])continue;
		dfs2(y,x);
	}
}
	int cnt=0;
void solve(){
	dfs1(1,0);
	ans=0;
	lst=0;dfs2(1,0);
	for(int i=2;i<=n;i++){
		s[i][1]=s[1][1]-s[i][1];
		s[i][2]=s[1][2]-s[i][2];
		t[i][1]=t[1][1]-t[i][1];
		t[i][2]=t[1][2]-t[i][2];
	}
	lst=0;dfs2(1,0);
	write(ans);puts("");
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	fac[0]=inv[0]=1;
	for(int i=1;i<N;i++){
		fac[i]=fac[i-1]*i%mod;
		inv[i]=qmi(fac[i],mod-2); 
	}
	tt=read();
	while(tt--){
		cnt++;
		n=read();
		for(int i=1;i<3;i++)
			for(int j=1;j<=n;j++)
				s[j][i]=t[j][i]=0;
		for(int i=1;i<=n;i++){
			head[i]=0;sz[i]=1;son[i]=-1;
		}
		tot=1;
		for(int i=1;i<n;i++){
			int x=read(),y=read();
			add(x,y);add(y,x);
		}
		cin>>s1>>t1;
		solve();
	}
	return 0;
}
/*
3
2
1 2
00
11
3
1 2
2 3
???
???
3
1 2
2 3
??1
0?0
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 6ms
memory: 11896kb

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: 13ms
memory: 13848kb

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: 32ms
memory: 14032kb

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: 32ms
memory: 13956kb

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: 50ms
memory: 14304kb

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: