QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#608482 | #7509. 01tree | cjx | TL | 137ms | 15568kb | C++20 | 3.2kb | 2024-10-03 22:10:21 | 2024-10-03 22:10:21 |
Judging History
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;sz[x]=1;son[x]=0;
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]||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;
}
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])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);
}
}
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--){
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;
}
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
*/
詳細信息
Test #1:
score: 100
Accepted
time: 8ms
memory: 11924kb
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: 14ms
memory: 13836kb
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: 13ms
memory: 14000kb
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: 91ms
memory: 13936kb
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: 137ms
memory: 14428kb
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: 70ms
memory: 15568kb
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: -100
Time Limit Exceeded
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...