Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37940 LYLAKIOIAKIOI 【BJ】T2 C++ 解答错误 0 489 MS 51064 KB 2913 2025-06-02 17:44:23

Tests(0/25):


#include<bits/stdc++.h> using namespace std; const int N=1e6+10,mod=1e9+7; void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} int n,ans[N]; int delta[N][2],op[N]; int ch[N][2],fa[N]; int f[N],g[N]; bool chk(int x){ return ch[fa[x]][1]==x; } int b[N][2],dep[N]; void dfs1(int u){ b[u][0]=1; if(ch[u][0]){ dep[ch[u][0]]=dep[u]+1; dfs1(ch[u][0]); b[u][0]+=b[ch[u][0]][1]; b[u][1]+=b[ch[u][0]][0]; } if(ch[u][1]){ dep[ch[u][1]]=dep[u]+1; dfs1(ch[u][1]); b[u][0]+=b[ch[u][1]][1]; b[u][1]+=b[ch[u][1]][0]; } }void dfs2(int u){ if(ch[u][0]){ Add(f[ch[u][0]],f[u]); dfs2(ch[u][0]); } if(ch[u][1]){ Add(f[ch[u][1]],f[u]); dfs2(ch[u][1]); } } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>ch[i][0]>>ch[i][1]; fa[ch[i][0]]=i; fa[ch[i][1]]=i; }for(int i=1;i<=n;i++){ if(fa[i]){ if(!fa[fa[i]]){//Zig delta[i][chk(i)]=mod-1;op[i]=1; }else if(chk(i)==chk(fa[i])){//Zig-Zig delta[i][0]=mod-1;delta[i][1]=mod-1; delta[i][chk(i)]--;op[i]=2; }else{//Zig-Zag delta[i][0]=mod-1;delta[i][1]=mod-1; op[i]=3; } } }dfs1(1); for(int i=1;i<=n;i++){ if(ch[i][0]) Add(f[ch[i][0]],delta[i][0]); if(ch[i][1]) Add(f[ch[i][1]],delta[i][1]); //y=fa(x) if(op[i]==1) Add(g[i],mod-1); if(op[i]>1) Add(g[i],mod-2); //y=x for(int o1=0;o1<=1;o1++){ for(int o2=0;o2<=1;o2++){ int x=ch[ch[i][o1]][o2]; if(!x) continue; if(o1==o2) Add(g[i],2ll*b[x][0]%mod); else Add(g[i],b[x][0]); //if(i==6)cout<<b[x][0]*((o1==o2)+1)<<endl; Add(g[i],1ll*delta[i][o1^1]*b[x][0]%mod); } int x=ch[i][o1]; if(!x) continue; if(op[x]==1) Add(g[i],b[x][0]); else if(op[x]==2) Add(g[i],delta[fa[i]][o1^1]); else if(op[x]==3) Add(g[i],delta[fa[i]][o1]); } //y\in subtree(x) if(!fa[i]) continue; int br=ch[fa[i]][chk(i)^1]; if(op[br]!=3) Add(f[i],b[br][0]); if(ch[br][0]){ if(op[ch[br][0]]==3) Add(f[i],b[ch[br][0]][0]); else Add(f[i],2ll*b[ch[br][0]][0]%mod); } if(ch[br][1]){ if(op[ch[br][1]]==3) Add(f[i],b[ch[br][1]][0]); else Add(f[i],2ll*b[ch[br][1]][0]%mod); } Add(f[i],1ll*delta[fa[i]][chk(i)]*b[br][1]%mod); }dfs2(1); for(int i=1;i<=n;i++){ cout<<(1ll*dep[i]*n+f[i]+g[i])%mod<<'\n'; }cout.flush(); return 0; }


测评信息: