社区讨论

为什么只有70分

P2634[国家集训队] 聪聪可可参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi6nbs84
此快照首次捕获于
2025/11/20 07:41
4 个月前
此快照最后确认于
2025/11/20 07:41
4 个月前
查看原帖
空间开到这么大也只有70分,开小一点就是60,在以后就是40。。。。。。。不敢再开了,我的思路和题解里一样,到底是哪里错了呢?求大佬指出,不胜感激。
CPP
// luogu-judger-enable-o2
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,e[10000000+1],nxt[10000000+1],to[10000000+1],w[10000000+1],k,a,b,c,d[10000000+1],tt,son[10000000+1],maxson[10000000+1];
bool vis[10000000+1],cz[10000000+1];
int sum,root,pp,js[10000000+1],ans;
int c1,c2;
int gcd(int a,int b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
void add(int k1,int k2,int k3)
{
    k++;
    to[k]=k2;
    w[k]=k3;
    nxt[k]=e[k1];
    e[k1]=k;
    k++;
    to[k]=k1;
    w[k]=k3;
    nxt[k]=e[k2];
    e[k2]=k;
    return;
}
void getroot(int x,int fa)
{
    son[x]=1;
    maxson[x]=0;
    for(int i=e[x];i!=0;i=nxt[i])
    {
        if(to[i]!=fa and vis[to[i]]==0)
        {
            getroot(to[i],x);
            son[x]=son[x]+son[to[i]];
            maxson[x]=max(maxson[x],son[to[i]]);
        }
    }
    maxson[x]=max(maxson[x],sum-son[x]);
    if(maxson[x]<maxson[root])
    {
        root=x;
    }
    return;
}
void getdeep(int x,int fa)
{
    js[d[x]%3]++;
    for(int j=e[x];j!=0;j=nxt[j])
    {
        if(vis[to[j]]==1||to[j]==fa)
        {
            continue;
        }
        d[to[j]]=w[j]+d[x];
        cz[d[to[j]]]=1;
        tt++;
        getdeep(to[j],x);
    }
    return;
}
void solve(int x)
{
    d[x]=0;
    js[0]=js[1]=js[2]=0;
    cz[0]=1;
    tt=0;
    pp=0;
    getdeep(x,0);
    vis[x]=1;
    ans=ans+(js[0]*js[0]+2*js[1]*js[2]);
    for(int i=e[x];i!=0;i=nxt[i])
    {
        if(vis[to[i]]==0)
        {
            d[to[i]]=w[i];
            js[1]=js[0]=js[2]=0;
            getdeep(to[i],x);
            ans=ans-js[0]*js[0]-2*js[1]*js[2];
            root=0;
            sum=son[to[i]];
            getroot(to[i],0);
            solve(root);
        }
    }
    return;
}
int main()
{
    scanf("%d",&n);
    k=0;
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    root=0;
    sum=n;
    maxson[0]=n;
    getroot(1,0);
    solve(root);
    int gg;
    c1=n*n;
    int kk=gcd(c1,ans);
    cout<<ans/kk<<"/"<<c1/kk;
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...