社区讨论

(赏关x1)10h了调了10pts......

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lo1ahd6h
此快照首次捕获于
2023/10/22 17:51
2 年前
此快照最后确认于
2023/11/02 18:10
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int root;
struct node{
	int to;
	int val;
};
vector<node>mp[20004];
int sz[20004];
int dis[20004];
bool vis[20004];
int t[5];
int gcd(int a,int b){
	if(b==0){
		return a;
	}
	else return gcd(b,a%b);
}
void getroot(int x,int fa,int siz){
	sz[x]=1;
	bool isroot=1;
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i].to;
		if(to==fa||vis[to]){
			continue;
		}
		getroot(to,x,siz);
		sz[x]+=sz[to];
		if(sz[to]>siz/2){
			isroot=0;
		}
		
	}
	int ssz=siz-sz[x];
	if(ssz>siz/2){
		isroot=0;
	}
	if(isroot==1){
		root=x;
	}
}
void getdis(int x,int fa){
	sz[x]=1;
	t[dis[x]]++;
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i].to;
		if(to==fa||vis[to]){
			continue;
		}
		sz[x]+=sz[to];
		dis[to]=dis[x]+mp[x][i].val;
		dis[to]%=3;
		getdis(to,x);
	}
}
int calc(int x,int val){
	t[0]=t[1]=t[2]=0;//清空 
	dis[x]=val;
	getdis(x,0);
	return t[1]*t[2]*2+t[0]*t[0];
	
}
int ans=0;
void solve(int x){
	ans+=calc(x,0);
	vis[x]=1;
	cout<<"TEST: "<<x<<" "<<ans<<endl;
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i].to;
		if(vis[to]){
			continue;
		}
		ans-=calc(to,mp[x][i].val);
		getroot(to,x,sz[to]);
		solve(root);
	}
	
}
signed main(){
	ios::sync_with_stdio(false);
	int n;
	cin >> n;
	for(int i=1;i<=n-1;i++){
		int u,v,w;
		cin >> u >> v >> w;
		mp[u].push_back((node){v,w%3});
		mp[v].push_back((node){u,w%3});
	}
	getroot(1,0,n);
	
	solve(root);
	int gd=gcd(ans,n*n);
	cout<<ans/gd<<"/"<<n*n/gd;
}

回复

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

正在加载回复...