提交时间:2025-06-02 21:26:44
运行 ID: 37946
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e6+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,fa[maxn],ls[maxn],rs[maxn],op[maxn],f[maxn][2],t[maxn],dfn[maxn],siz[maxn],dep[maxn],ddep[maxn],s[maxn][2],ans[maxn],cnt; inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} inline void OP(int u,int v){ if(!u) return; t[dfn[u]]=add(t[dfn[u]],v);t[dfn[u]+siz[u]]=add(t[dfn[u]+siz[u]],mod-v); } void dfs(int u){ dfn[u]=++cnt,siz[u]=1; s[u][dep[u]]=1; if(u!=1){ if(fa[u]==1)f[u][op[u]]=mod-1; else if(op[u]==op[fa[u]])f[u][op[u]]=add(mod-2,f[fa[fa[u]]][op[u]]),f[u][!op[u]]=add(mod-1,f[fa[fa[u]]][!op[u]]); else f[u][0]=add(mod-1,f[fa[fa[u]]][0]),f[u][1]=add(mod-1,f[fa[fa[u]]][1]); } for(int p:{ls[u],rs[u]})if(p){ fa[p]=u; if(p==ls[u])op[p]=0;else op[p]=1; ddep[p]=ddep[u]+1,dep[p]=!dep[u];dfs(p); s[u][0]+=s[p][0],s[u][1]+=s[p][1]; siz[u]+=siz[p]; } } void slv(){ n=read(); up(i,1,n)ls[i]=read(),rs[i]=read();dfs(1); up(i,2,n){ //zig-zig int p=op[i]?ls[i]:rs[i],q=ls[i]^rs[i]^p; OP(p,s[q][!dep[i]]*1ll*(f[fa[i]][!op[i]]+1)%mod); //zig-zag OP(q,s[p][!dep[i]]*1ll*f[fa[i]][op[i]]%mod); } //zig OP(ls[1],s[rs[1]][1]),OP(rs[1],s[ls[1]][1]); up(i,1,n){ int LL=ls[ls[i]],LR=rs[ls[i]],RL=ls[rs[i]],RR=rs[rs[i]]; OP(rs[i],add(s[LL][dep[LL]]*1ll*(f[i][1]+2)%mod,s[LR][dep[LR]]*1ll*(f[i][1]+1)%mod)); OP(ls[i],add(s[RR][dep[RR]]*1ll*(f[i][0]+2)%mod,s[RL][dep[RL]]*1ll*(f[i][0]+1)%mod)); } up(i,1,n)OP(ls[i],f[i][0]),OP(rs[i],f[i][1]); up(i,1,n)t[i]=add(t[i],t[i-1]); up(i,1,n)ans[i]=t[dfn[i]]; ans[1]=add(ans[1],add(s[ls[1]][1],s[rs[1]][1])); up(i,2,n){ int p=op[i]?ls[i]:rs[i],q=ls[i]^rs[i]^p; ans[i]=add(ans[i],s[q][!dep[i]]*1ll*f[fa[i]][!op[i]]%mod); ans[i]=add(ans[i],s[p][!dep[i]]*1ll*f[fa[i]][op[i]]%mod); } up(i,1,n){ int LL=ls[ls[i]],LR=rs[ls[i]],RL=ls[rs[i]],RR=rs[rs[i]]; ans[i]=add(ans[i],add(s[LL][dep[LL]]*1ll*(f[i][1]+2)%mod,s[LR][dep[LR]]*1ll*(f[i][1]+1)%mod)); ans[i]=add(ans[i],add(s[RR][dep[RR]]*1ll*(f[i][0]+2)%mod,s[RL][dep[RL]]*1ll*(f[i][0]+1)%mod)); } up(i,1,n)ans[i]=add(ans[i],ddep[i]*1ll*(n-1)%mod); up(i,1,n)printf("%d\n",ans[i]); } int main(){ //freopen("dream.in","r",stdin),freopen("dream.out","w",stdout); slv(); return 0; }