sb树分治

/**************************************************************
Problem: 2152
User: walfy
Language: C++
Result: Accepted
Time:472 ms
Memory:3720 kb
****************************************************************/ //#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-6;
const int N=20000+10,maxn=5000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; struct edge{
int to,Next,c;
}e[N*4];
int cnt,head[N],num[10];
void init()
{
cnt=0;
memset(head,-1,sizeof head);
}
void add(int u,int v,int c)
{
e[cnt].to=v;
e[cnt].c=c;
e[cnt].Next=head[u];
head[u]=cnt++;
}
int vis[N],sz[N],zx[N];
void dfssz(int u,int f)
{
sz[u]=1;
for(int i=head[u];~i;i=e[i].Next)
{
int x=e[i].to;
if(x==f||vis[x])continue;
dfssz(x,u);
sz[u]+=sz[x];
}
}
void dfszx(int u,int f,int o,int &ans)
{
zx[u]=sz[o]-sz[u];
for(int i=head[u];~i;i=e[i].Next)
{
int x=e[i].to;
if(x==f||vis[x])continue;
zx[u]=max(zx[u],sz[x]);
dfszx(x,u,o,ans);
}
if(ans==-1||zx[ans]>zx[u])ans=u;
}
int findzx(int u,int f)
{
dfssz(u,f);
int ans=-1;
dfszx(u,f,u,ans);
return ans;
}
void dfsroot(int u,int f,int sum)
{
num[sum%3]++;
for(int i=head[u];~i;i=e[i].Next)
{
int x=e[i].to;
if(x==f||vis[x])continue;
dfsroot(x,u,sum+e[i].c);
}
}
int cal()
{
return num[0]*(num[0]-1)/2+num[1]*num[2];
}
int solve(int o,int f)
{
int root=findzx(o,f);
memset(num,0,sizeof num);
dfsroot(root,-1,0);
// printf("++++%d %d %d %d\n",num[0],num[1],num[2],cal());
int ans=cal();
vis[root]=1;
for(int i=head[root];~i;i=e[i].Next)
{
int x=e[i].to;
if(x==f||vis[x])continue;
memset(num,0,sizeof num);
dfsroot(x,root,e[i].c);
// printf("----%d %d %d %d\n",num[0],num[1],num[2],cal());
ans-=cal();
}
for(int i=head[root];~i;i=e[i].Next)
{
int x=e[i].to;
if(x==f||vis[x])continue;
ans+=solve(x,root);
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
init();
for(int i=1;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);add(b,a,c);
}
int ans1=solve(1,-1)*2+n;
int ans2=n*n;
int p=__gcd(ans1,ans2);
printf("%d/%d\n",ans1/p,ans2/p);
return 0;
}
/******************** ********************/

最新文章

  1. 辛巴学院-Unity-剑英陪你零基础学c#系列(二)顺序
  2. 学习Scala01 环境安装
  3. 综合支撑【恶灵附身 Psycho Break】的世界观的概念艺术
  4. Effective C++ 2.构造 析构 赋值运算
  5. ORACLE 12C PDB 维护基础介绍
  6. SVN使用(二)
  7. hdu 1016 Prime Ring Problem(深度优先搜索)
  8. BI服务器配置与客户端情况
  9. 百度网盘免VIP全速下载!
  10. 【腾讯云的1001种玩法】 Laravel 整合微视频上传管理能力,轻松打造视频App后台
  11. 小程序 textarea
  12. 最新的 Vue 相关开源项目库汇总
  13. 第二百七十五节,MySQL数据库安装和介绍
  14. MySQL☞abs函数
  15. Java入门系列-09-循环结构
  16. ActiveMQ安装与持久化消息
  17. classmethod
  18. iOS 运行时详解
  19. LeetCode(39) Combination Sum
  20. NYOJ 题目42 一笔画问题

热门文章

  1. WebConfig配置详解大全
  2. .Net 获取前端传递的数据
  3. poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】
  4. I/O排查命令
  5. Scala并发编程模型AKKA
  6. CF734F Anton and School 构造+数论
  7. Http协议中Cookie详细介绍(转)
  8. mysql 数据操作 单表查询 通过四则运算查询
  9. mysql 约束条件 auto_increment 自动增长起始值 布长 起始偏移量
  10. 前端基础(CSS)