Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37947 baka24 【BJ】T2 C++ 解答错误 52 288 MS 53544 KB 3532 2025-06-02 21:41:30

Tests(13/25):


#include<bits/stdc++.h> using namespace std; #define int long long int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=500010,N=30,inf=1e18,Mod=1e9+7; void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;if(x<0)x+=Mod;} int n,rt,ls[MAXN],rs[MAXN],br[MAXN],fa[MAXN],dep[MAXN],as[MAXN],ans[MAXN],d[2][MAXN],siz[2][MAXN],f[MAXN][2]; bool lr[MAXN]; void dfs(int x){ dep[ls[x]]=dep[rs[x]]=dep[x]+1,lr[x]=rs[fa[x]]==x; siz[dep[x]&1][x]=1; if(x==rt)f[x][0]=f[x][1]=0; else if(fa[x]==rt)f[x][lr[x]]=-1,f[x][lr[x]^1]=0; else if(lr[x]==lr[fa[x]])f[x][lr[x]]=-2+f[fa[fa[x]]][lr[x]],f[x][lr[x]^1]=-1+f[fa[fa[x]]][lr[x]^1]; else f[x][0]=f[fa[fa[x]]][0]-1,f[x][1]=f[fa[fa[x]]][1]-1; if(ls[x])dfs(ls[x]),siz[0][x]+=siz[0][ls[x]],siz[1][x]+=siz[1][ls[x]]; if(rs[x])dfs(rs[x]),siz[0][x]+=siz[0][rs[x]],siz[1][x]+=siz[1][rs[x]]; } void dfs2(int x){ ans[x]=ans[x]+as[x]+dep[x]*(n-1); if(ls[x])as[ls[x]]+=as[x],dfs2(ls[x]); if(rs[x])as[rs[x]]+=as[x],dfs2(rs[x]); } void sol(int u){ if(u!=rt){ as[ls[u]]+= (f[u][0]+2)*siz[dep[u]&1][rs[rs[u]]]+ (f[u][0]+1)*siz[dep[u]&1][ls[rs[u]]]+ (lr[u]?(f[fa[u]][0]+1)*siz[dep[u]&1^1][rs[u]]:(f[fa[u]][0])*siz[dep[u]&1^1][rs[u]]) ; as[rs[u]]+= (f[u][1]+2)*siz[dep[u]&1][ls[ls[u]]]+ (f[u][1]+1)*siz[dep[u]&1][rs[ls[u]]]+ (lr[u]?(f[fa[u]][1])*siz[dep[u]&1^1][ls[u]]:(f[fa[u]][1]+1)*siz[dep[u]&1^1][ls[u]]) ; as[ls[u]]+=f[u][0],as[rs[u]]+=f[u][1]; // cout<< // f[fa[u]][lr[u]]*siz[dep[u]&1^1][lr[u]?ls[u]:rs[u]]<<" "<< // f[fa[u]][lr[u]^1]*siz[dep[u]&1^1][lr[u]?rs[u]:ls[u]]<<" "<< // +(f[u][1]+1)*siz[dep[u]&1][rs[ls[u]]]<<" "<< // +(f[u][0]+2)*siz[dep[u]&1][rs[rs[u]]]<<" "<< // +(f[u][0]+1)*siz[dep[u]&1][ls[rs[u]]]<<" "<< // +(f[u][1]+2)*siz[dep[u]&1][ls[ls[u]]]<<endl; ans[u]+= f[fa[u]][lr[u]]*siz[dep[u]&1^1][lr[u]?ls[u]:rs[u]]+ f[fa[u]][lr[u]^1]*siz[dep[u]&1^1][lr[u]?rs[u]:ls[u]]+ +(f[u][1]+1)*siz[dep[u]&1][rs[ls[u]]] +(f[u][0]+2)*siz[dep[u]&1][rs[rs[u]]] +(f[u][0]+1)*siz[dep[u]&1][ls[rs[u]]] +(f[u][1]+2)*siz[dep[u]&1][ls[ls[u]]]; } else{ as[ls[u]]+= (f[u][0]+2)*siz[dep[u]&1][rs[rs[u]]]+ (f[u][0]+1)*siz[dep[u]&1][ls[rs[u]]]+ (1)*siz[dep[u]&1^1][rs[u]]; as[rs[u]]+= (f[u][1]+2)*siz[dep[u]&1][ls[ls[u]]]+ (f[u][1]+1)*siz[dep[u]&1][rs[ls[u]]]+ (1)*siz[dep[u]&1^1][ls[u]]; ans[u]+=1*siz[dep[u]&1^1][u]+ +(f[u][1]+1)*siz[0][rs[ls[u]]] +(f[u][0]+2)*siz[0][rs[rs[u]]] +(f[u][0]+1)*siz[0][ls[rs[u]]] +(f[u][1]+2)*siz[0][ls[ls[u]]]; } } void slv(){ n=read(); for(int i=1;i<=n;i++)fa[ls[i]=read()]=i,fa[rs[i]=read()]=i,br[ls[i]]=rs[i],br[rs[i]]=ls[i]; rt=1,dfs(1); siz[0][0]=siz[1][0]=ls[0]=rs[0]=0; for(int i=1;i<=n;i++)sol(i); // for(int i=1;i<=n;i++)cout<<" "<<dep[i]<<" "<<as[i]<<" "<<ans[i]<<" "<<siz[0][i]<<" "<<siz[1][i]<<endl; dfs2(1); for(int i=1;i<=n;i++)printf("%lld\n",ans[i]); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); return 0; }


测评信息: