QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#401733#7509. 01treeGraphcityTL 62ms15696kbC++203.0kb2024-04-29 11:30:352024-04-29 11:30:36

Judging History

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

  • [2024-04-29 11:30:36]
  • 评测
  • 测评结果:TL
  • 用时:62ms
  • 内存:15696kb
  • [2024-04-29 11:30:35]
  • 提交

answer

#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rof(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
const int Maxn=2e5,BK=317,Mod=1e9+7;

inline int Pow(int x,int y)
{
    int res=1;
    while(y)
    {
        if(y&1) res=1ll*res*x%Mod;
        x=1ll*x*x%Mod,y>>=1;
    }
    return res;
}

int n,ans,fac[Maxn+5],inv[Maxn+5]; char s[Maxn+5],t[Maxn+5];
int A1[Maxn+5],B1[Maxn+5],C1[Maxn+5],S,T;
inline int C(int x,int y) {return (x<y || y<0)?0:1ll*fac[x]*inv[x-y]%Mod*inv[y]%Mod;}
vector<int> v[Maxn+5];

struct Node{int p,q;} h[Maxn+5];
struct Data
{
    int s,t,p,q,ans;
    inline void Clear() {ans=0; For(c,0,q) ans=(ans+1ll*C(p,c)*C(s-p,t-c))%Mod;}
    inline void Addp() {ans=(ans-1ll*C(p,q)*C(s-p-1,t-q-1)%Mod+Mod)%Mod,p++;}
    inline void Delp() {--p,ans=(ans+1ll*C(p,q)*C(s-p-1,t-q-1))%Mod;}
    inline void Addq() {++q,ans=(ans+1ll*C(p,q)*C(s-p,t-q))%Mod;}
    inline void Delq() {ans=(ans-1ll*C(p,q)*C(s-p,t-q)%Mod+Mod)%Mod,q--;}
    inline void Move(int P,int Q)
    {
        if(P<0) return;
        while(q<Q) Addq(); while(q>Q) Delq();
        while(p<P) Addp(); while(p>P) Delp();
    }
} K1,K2;

inline void dfs(int x,int f,int d)
{
    int sx=(s[x]=='?'?2:s[x]-'0'),tx=(t[x]=='?'?2:t[x]-'0');
    if(d&1) {if(sx<=1) sx^=1; if(tx<=1) tx^=1;}
    A1[x]=(sx==0)-(tx==0),B1[x]=(sx==2),C1[x]=(tx==2);
    for(auto y:v[x]) if(y!=f) dfs(y,x,d+1),A1[x]+=A1[y],B1[x]+=B1[y],C1[x]+=C1[y];
}
inline void Work()
{
    S=B1[1]+C1[1],T=C1[1]-A1[1];
    K1.s=S,K1.t=T,K1.p=K1.q=0,K1.Clear();
    K2.s=S-1,K2.t=T-1,K2.p=K2.q=0,K2.Clear();
    For(_,1,n-1)
    {
        auto [p,q]=h[_]; int s1=0,s2=0,s3=0,s4=0;

        K1.Move(p,q-1),K2.Move(p-1,q-2);
        // K1.Clear(),K2.Clear();
        s1=(C(S,T)-K1.ans+Mod)%Mod,s2=(C(S-1,T-1)-(p<=0?0:K2.ans)+Mod)%Mod;
        int t1=0; For(c,max(0,q),n) t1=(t1+1ll*C(p,c)*C(S-p,T-c))%Mod;
        int t2=0; For(c,max(0,q-1),n) t2=(t2+1ll*C(p-1,c)*C(S-p,T-1-c))%Mod;
        ans=(ans+1ll*s2*p+1ll*(Mod-q)*s1)%Mod;

        For(c,0,min(p,q-1)) s3=(s3+1ll*C(p,c)*C(S-p,T-c))%Mod;
        For(c,0,min(p,q-2)) s4=(s4+1ll*C(p-1,c)*C(S-p,T-1-c))%Mod;
        ans=(ans+1ll*s3*q+1ll*(Mod-p)*s4)%Mod;
    }
}
inline void Solve()
{
    cin>>n; ans=0; For(i,1,n-1)
    {
        int a,b; cin>>a>>b;
        v[a].push_back(b),v[b].push_back(a);
    } scanf("%s%s",s+1,t+1); dfs(1,0,0);
    For(i,2,n)
    {
        int a=A1[i],b=B1[i],c=C1[i],d=A1[1]-A1[i],e=B1[1]-B1[i],f=C1[1]-C1[i];
        int p=b+c,q=c-a; h[i-1]=Node{p,q};
    }
    sort(h+1,h+n,[&](Node x,Node y){
        if(x.p/BK!=y.p/BK) return x.p<y.p;
        else return x.q<y.q;
    }); Work();
    cout<<ans<<endl; For(i,1,n) vector<int>().swap(v[i]);
}

int main()
{
    // freopen("1.in","r",stdin);

    int T; cin>>T; fac[0]=inv[0]=1;
    For(i,1,Maxn) fac[i]=1ll*fac[i-1]*i%Mod;
    inv[Maxn]=Pow(fac[Maxn],Mod-2)%Mod;
    Rof(i,Maxn-1,1) inv[i]=1ll*inv[i+1]*(i+1)%Mod;
    while(T--) Solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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

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: 9140kb

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: 5ms
memory: 9664kb

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: 21ms
memory: 8876kb

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: 62ms
memory: 14732kb

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: 53ms
memory: 15696kb

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: -100
Time Limit Exceeded

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:


result: