社区讨论
(赏关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 条回复,欢迎继续交流。
正在加载回复...