zoukankan      html  css  js  c++  java
  • 【点分治】bzoj2152 聪聪可可

    模板题。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define MAXN 20001
    #define INF 2147483647
    typedef pair<int,int> Point;
    int n,K,ans,T[3];
    int v[MAXN<<1],w[MAXN<<1],first[MAXN],next[MAXN<<1],en;
    int dis[MAXN],En,last;
    void AddEdge(const int &U,const int &V,const int &W)
    {
        v[++en]=V;
        w[en]=W;
        next[en]=first[U];
        first[U]=en;
    }
    bool centroid[MAXN];
    int size[MAXN];
    int calc_sizes(int U,int Fa)
    {
        int res=1;
        for(int i=first[U];i;i=next[i])
          if(v[i]!=Fa&&(!centroid[v[i]]))
            res+=calc_sizes(v[i],U);
        return size[U]=res;
    }
    Point calc_centroid(int U,int Fa,int nn)
    {
        Point res=make_pair(INF,-1);
        int sum=1,maxv=0;
        for(int i=first[U];i;i=next[i])
          if(v[i]!=Fa&&(!centroid[v[i]]))
            {
              res=min(res,calc_centroid(v[i],U,nn));
              maxv=max(maxv,size[v[i]]);
              sum+=size[v[i]];
            }
        maxv=max(maxv,nn-sum);
        res=min(res,make_pair(maxv,U));
        return res;
    }
    void calc_dis(int U,int Fa,int d)
    {
        dis[En++]=d;
        for(int i=first[U];i;i=next[i])
          if(v[i]!=Fa&&(!centroid[v[i]]))
            calc_dis(v[i],U,(d+w[i])%3);
    }
    int calc_pairs(int s)
    {
        for(int i=last;i<En;++i)
          ans+=T[(3-dis[i])%3];
        for(int i=last;i<En;++i)
          ++T[dis[i]];
    }
    void solve(int U)
    {
        calc_sizes(U,-1);
        int s=calc_centroid(U,-1,size[U]).second;
        centroid[s]=1;
        for(int i=first[s];i;i=next[i])
          if(!centroid[v[i]])
            solve(v[i]);
        En=0; dis[En++]=0;
        for(int i=first[s];i;i=next[i])
          if(!centroid[v[i]])
            {
              last=En;
              calc_dis(v[i],s,w[i]);
              calc_pairs(s);
        	}
        T[1]=T[2]=0; T[0]=1;
        centroid[s]=0;
    }
    int main()
    {
        int a,b,c; T[0]=1;
        scanf("%d",&n);
        for(int i=1;i<n;++i)
          {
          	scanf("%d%d%d",&a,&b,&c); c%=3;
          	AddEdge(a,b,c);
          	AddEdge(b,a,c);
          }
        solve(1);
        ans=(ans<<1)+n;
        int GCD=__gcd(ans,n*n);
        printf("%d/%d
    ",ans/GCD,n*n/GCD);
        return 0;
    }
  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4293683.html
Copyright © 2011-2022 走看看