QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#401733 | #7509. 01tree | Graphcity | TL | 62ms | 15696kb | C++20 | 3.0kb | 2024-04-29 11:30:35 | 2024-04-29 11:30:36 |
Judging History
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...