社区讨论
为什么只有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 条回复,欢迎继续交流。
正在加载回复...