TLE求助
查看原帖
TLE求助
416388
a16_楼主2024/3/2 19:45

TLE求助

全T,感觉很奇怪,但是找不出错误

#include<bits/stdc++.h>
using namespace std;
const int N=2e4+10;
typedef long long ll;
int n,cnt,head[N],vis[N],sum;
struct edge{
	int to,w,nxt;
}e[N*2];
void add(int u,int v,int w){
	e[++cnt]=(edge){v,w,head[u]};
	head[u]=cnt;
}
int sz[N],mx[N];
void chkmax(int &a,int b){a>b?(a=a):(a=b);}
void getG(int x,int fa,int &rt){
    sz[x]=1;mx[x]=0;
    for (int i=head[x];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==fa||vis[v] ) continue;
        getG(v,x,rt);
        sz[x]+=sz[v];
        chkmax(mx[x],sz[v]);
    }
    chkmax(mx[x],sum-sz[x]);
    if(mx[x]<mx[rt]) rt=x;
}
int ans,d[N],t[N];
int getdeep(int u,int fa){
	t[d[u]]++;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa||vis[v]) continue;
		d[v]=(d[u]+e[i].w)%3;
		getdeep(v,u);
	}
}
int calc(int u,int len){
	t[0]=t[1]=t[2]=0;
	d[u]=len;
	getdeep(u,0);
	return t[1]*t[2]*2+t[0]*t[0];
}
void slove(int u){
	ans+=calc(u,0);
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(vis[v]) continue;
		ans-=calc(v,e[i].w);
		int G=0;
		mx[0]=n,sum=sz[v];
		getG(v,u,G);
		slove(G);
	}
}
int main(){
	scanf("%d",&n);
    for(int i=1;i<n;i++){
    	int x,y,z; scanf("%d%d%d",&x,&y,&z);
    	z%=3;add(x,y,z);add(y,x,z);
    }
    int rt=1;mx[0]=sum=n;getG(1,0,rt);
	slove(rt);
	int Gcd=__gcd(ans,n*n);
	printf("%d/%d",ans/Gcd,n*n/Gcd);
	return 0;
}
2024/3/2 19:45
加载中...