【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2152

【题目大意】

  给出一棵树,问任取两点之间距离为3的倍数的概率是多少

【题解】

  树分治统计模3之后不同的链长计算答案,最后和总数求个gcd化简即可。

【代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <cstring>
  5. using namespace std;
  6. typedef pair<int,int> P;
  7. #define ff first
  8. #define ss second
  9. const int N=20010;
  10. int n,cnt,ans,root,sum;
  11. int size[N],dp[N],d[N],t[5],vis[N];
  12. vector<P> G[N];
  13. void add_edge(int u,int v,int w){
  14. G[u].push_back(P(v,w));
  15. G[v].push_back(P(u,w));
  16. }
  17. void getroot(int x,int fx){
  18. size[x]=1; dp[x]=0;
  19. for(int i=0;i<G[x].size();i++){
  20. int y=G[x][i].ff,z=G[x][i].ss;
  21. if(!vis[y]&&y!=fx){
  22. getroot(y,x);
  23. size[x]+=size[y];
  24. dp[x]=max(dp[x],size[y]);
  25. }
  26. }dp[x]=max(dp[x],sum-size[x]);
  27. if(dp[x]<dp[root])root=x;
  28. }
  29. void getdeep(int x,int fx){
  30. t[d[x]]++;
  31. for(int i=0;i<G[x].size();i++){
  32. int y=G[x][i].ff,z=G[x][i].ss;
  33. if(!vis[y]&&y!=fx){
  34. d[y]=(d[x]+z)%3;
  35. getdeep(y,x);
  36. }
  37. }
  38. }
  39. int cal(int x,int dx){
  40. t[0]=t[1]=t[2]=0;
  41. d[x]=dx;
  42. getdeep(x,0);
  43. return t[1]*t[2]*2+t[0]*t[0];
  44. }
  45. void solve(int x){
  46. ans+=cal(x,0); vis[x]=1;
  47. for(int i=0;i<G[x].size();i++){
  48. int y=G[x][i].ff,z=G[x][i].ss;
  49. if(!vis[y]){
  50. ans-=cal(y,z);
  51. root=0;sum=size[y];
  52. getroot(y,0);
  53. solve(root);
  54. }
  55. }
  56. }
  57. int main(){
  58. while(~scanf("%d",&n)){
  59. for(int i=1;i<=n;i++)G[i].clear();
  60. for(int i=1;i<n;i++){
  61. int u,v,w;
  62. scanf("%d%d%d",&u,&v,&w);
  63. add_edge(u,v,w%3);
  64. }dp[0]=sum=n; ans=0;
  65. memset(vis,0,sizeof(vis));
  66. getroot(1,0);
  67. solve(root);
  68. int t=__gcd(ans,n*n);
  69. printf("%d/%d\n",ans/t,n*n/t);
  70. }return 0;
  71. }

BZOJ 2152 聪聪可可(点分治)的更多相关文章

  1. 洛谷 P2634 BZOJ 2152 【模板】点分治(聪聪可可)

    题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...

  2. 【BZOJ 2152】 聪聪可可

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2152 [算法] 点分治 [代码] #include<bits/stdc++.h ...

  3. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  4. 【BZOJ 2152】聪聪可可 点分治

    对于一棵树,fdrt找到重心,然后分治每个子树. 在一棵以重心为根的树上,符合条件的链是: 1.过重心(根) 2.不过重心 对于1我们只需dfs出距离重心(根)的距离然后统计再减去有重叠的边 对于2我 ...

  5. BZOJ 2152:聪聪可可(树上点分治)

    题目链接 题意 中文题意. 思路 和上一题类似,只不过cal()函数需要发生变化. 题目中要求是3的倍数,那么可以想到 (a + b) % 3 == 0 和 (a % 3 + b % 3) % 3 = ...

  6. 「BZOJ 2152」聪聪可可

    题目链接 戳这 \(Solution\) 这道题看起来就像点分治对吧.没错就是点分治. 什么是点分治 如果你不会点分治,可以去看看这儿 现在看到这里,首先确保你已经会了点分治,如果不会你还往下看,听不 ...

  7. BZOJ 2152: 聪聪可可 树分治

    2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  8. 【BZOJ】2152: 聪聪可可(点分治)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2152 随便点分..... 只是我在考虑一个地方逗乐.. 当路径长度mod3=0的点数直接乘起来就好. ...

  9. BZOJ 2152: 聪聪可可 点分治

    2152: 聪聪可可 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...

  10. bzoj 2152: 聪聪可可 树的点分治

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 485  Solved: 251[Submit][Status] Descripti ...

随机推荐

  1. java 连接MySQL的代码

    1.java connect MySQL as conding. https://www.cnblogs.com/centor/p/6142775.html

  2. 大聊Python----Select解析

    1.首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当sele ...

  3. python进行机器学习(一)之数据预处理

    一.加载数据 houseprice=pd.read_csv('../input/train.csv') #加载后放入dataframe里 all_data=pd.read_csv('a.csv', h ...

  4. mysql not null default / default

    not null default 说明不能是NULL, 并设置默认值 default 设置默认值 , 但值也可能是NULL mysql> create table test (id int, n ...

  5. foreign key constraint fails错误的原因

    建表:CREATE TABLE Course ( Cno Char(4) PRIMARY KEY, Cname Char(40), Cpno Char(4), Ccredit Int, FOREIGN ...

  6. Win10默认浏览器怎么设置

    1.首先在Win10桌面左下角的开始菜单图标上右键单击鼠标,在弹出的菜单选项中,点击进入“控制面板”,如下图所示. 接下来就可以找到“默认程序”设置了,找到后点击进入设置,如下图所示. 打开Win10 ...

  7. 海量数据排序——如果有1TB的数据需要排序,但只有32GB的内存如何排序处理?

    转载:https://blog.csdn.net/fx677588/article/details/72471357 1.外排序  传统的排序算法一般指内排序算法,针对的是数据可以一次全部载入内存中的 ...

  8. python基础===中文手册,可查询各个模块

    http://python.usyiyi.cn/translate/python_352/index.html

  9. JS页面之间传值

    父页面与子页面之间有多种传值的方式: 第一种,通过window.open的方法打开一个新的页面,在新的页面里面通过window.opener来获取对象,以下为实例 父页面: function open ...

  10. css文件放在头部的原因

    我在博问上发的一个这个问题 然后有人这样回复我的 我感觉很有道理的样子 所以我放上来了 这样会先加载css的样式,在渲染dom的时候已经知道了自己的样式了,所以一次渲染成功 如果css放在底部,那么需 ...