点分治10分求助
查看原帖
点分治10分求助
460457
min_inf楼主2023/4/4 21:52

rt,#2-#10 WA

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
const int maxn = 2e4+5;
int n,u,v,w,a,b,c;
int sz[maxn],f[maxn],tot,center;
int d[maxn],dis[maxn],cnt;
int num[3],ans;
vector<pii>G[maxn];
bitset<maxn>vis;
void getcenter(int u,int fa){
    f[u]=0;
    sz[u]=1;
    for(auto p:G[u]){
        int v=p.first;
        if(v==fa||vis[v])continue;
        getcenter(v,u);
        sz[u]+=sz[v];
        f[u]=max(f[u],sz[v]);
    }
    f[u]=max(f[u],tot-sz[u]);
    if(f[u]<f[center])center=u;
}
void dfs(int u,int fa){
    d[++cnt]=dis[u];
    for(auto p:G[u]){
        int v=p.first;
        if(v==fa||vis[v])continue;
        dis[v]=dis[u]+w;
        dfs(v,u);
    }
}
void calc(int u){
    num[0]=1;
    for(auto p:G[u]){
        int v=p.first,w=p.second;
        if(vis[v])continue;
        cnt=0;
        dis[v]=w;
        dfs(v,u);
        for(int i=1;i<=cnt;++i)ans+=num[(3-d[i]%3)%3];
        for(int i=1;i<=cnt;++i)++num[d[i]%3];
    }
    num[0]=num[1]=num[2]=0;
}
void solve(int u){
    calc(u);
    vis[u]=1;
    for(auto p:G[u]){
        int v=p.first;
        if(vis[v])continue;
        center=0;
        f[0]=tot=sz[v];
        getcenter(v,0);
        getcenter(center,0);
        solve(center);
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n;
    for(int i=1;i<n;++i){
        cin>>u>>v>>w;
        G[u].push_back({v,w});
        G[v].push_back({u,w});
    }
    f[0]=tot=n;
    getcenter(1,0);
    getcenter(center,0);
    solve(center);
    a=ans*2+n;
    b=n*n;
    c=__gcd(a,b);
    cout<<a/c<<'/'<<b/c;
    return 0;
}
2023/4/4 21:52
加载中...