P2634 [国家集训队]聪聪可可(题解)(点分治)

洛谷题目

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<iomanip>
  7. #include<algorithm>
  8. #include<ctime>
  9. #include<queue>
  10. #include<stack>
  11. #include<vector>
  12. #define rg register
  13. #define il inline
  14. #define lst long long
  15. #define ldb long double
  16. #define N 20050
  17. using namespace std;
  18. const int Inf=1e9;
  19. int n,cnt,ans;
  20. int Max,tot,root;
  21. struct EDGE{
  22. int to,nxt,v;
  23. }ljl[N<<1];
  24. int hd[N];
  25. int size[N],vis[N];
  26. int dis[N],hh[3];
  27. il int read()
  28. {
  29. rg int s=0,m=0;rg char ch=getchar();
  30. while(ch<'0'||ch>'9'){if(ch=='-')m=1;ch=getchar();}
  31. while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
  32. return m?-s:s;
  33. }
  34. il void add(rg int p,rg int q,rg int o)
  35. {
  36. ljl[++cnt]=(EDGE){q,hd[p],o},hd[p]=cnt;
  37. }
  38. void get_root(rg int now,rg int fm)
  39. {
  40. size[now]=1;rg int num=0;
  41. for(rg int i=hd[now];i;i=ljl[i].nxt)
  42. {
  43. rg int qw=ljl[i].to;
  44. if(qw==fm||vis[qw])continue;
  45. get_root(qw,now);
  46. size[now]+=size[qw];
  47. num=max(num,size[qw]);
  48. }
  49. num=max(num,tot-size[now]);
  50. if(Max>num)Max=num,root=now;
  51. }
  52. void get_dis(rg int now,rg int fm)
  53. {
  54. hh[dis[now]%3]++;
  55. for(rg int i=hd[now];i;i=ljl[i].nxt)
  56. {
  57. rg int qw=ljl[i].to;
  58. if(qw==fm||vis[qw])continue;
  59. dis[qw]=dis[now]+ljl[i].v;
  60. get_dis(qw,now);
  61. }
  62. }
  63. il int Query(rg int now,rg int base)
  64. {
  65. rg int res=0;
  66. hh[0]=hh[1]=hh[2]=0;
  67. dis[now]=base;
  68. get_dis(now,0);
  69. res+=hh[0]*hh[0]+(hh[1]*hh[2]<<1);
  70. return res;
  71. }
  72. void divide(rg int now,rg int fm)
  73. {
  74. ans+=Query(now,0),vis[now]=1;
  75. rg int all=tot;
  76. for(rg int i=hd[now];i;i=ljl[i].nxt)
  77. {
  78. rg int qw=ljl[i].to;
  79. if(qw==fm||vis[qw])continue;
  80. ans-=Query(qw,ljl[i].v);
  81. tot=size[now]>size[qw]?size[qw]:all-size[qw];
  82. root=0,Max=Inf;
  83. get_root(qw,0);
  84. divide(root,0);
  85. }
  86. }
  87. il int gcd(rg int x,rg int y)
  88. {
  89. return y?gcd(y,x%y):x;
  90. }
  91. int main()
  92. {
  93. n=read();
  94. for(rg int i=1;i<n;++i)
  95. {
  96. rg int p=read(),q=read(),o=read();
  97. add(p,q,o),add(q,p,o);
  98. }
  99. Max=Inf,tot=n;
  100. get_root(1,0),divide(root,0);
  101. rg int GCD=gcd(ans,n*n);
  102. printf("%d/%d\n",ans/GCD,n*n/GCD);
  103. return 0;
  104. }

P2634 [国家集训队]聪聪可可(题解)(点分治)的更多相关文章

  1. bzoj2152 / P2634 [国家集训队]聪聪可可(点分治)

    P2634 [国家集训队]聪聪可可 淀粉质点分治板子 边权直接 mod 3 直接点分治统计出所有的符合条件的点对再和总方案数约分 至于约分.....gcd搞搞就好辣 #include<iostr ...

  2. 洛谷 P2634 [国家集训队]聪聪可可 解题报告

    P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一 ...

  3. 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量

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

  4. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  5. 洛谷P2634 [国家集训队]聪聪可可 (点分治)

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

  6. luogu P2634 [国家集训队]聪聪可可 点分治

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

  7. 洛谷-P2634 [国家集训队]聪聪可可 点分治

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

  8. 洛谷 P4206 [NOI2005]聪聪与可可 题解

    题面 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每 ...

  9. 【NOI2005】聪聪与可可 题解(最短路+期望DP)

    前言:学长讲的太神了:自己还能推出来DP式子,挺开心. -------------------------- 题目链接 题目大意:给定一张含有$n$个结点$m$条边的无向连通图.现在聪聪在点$s$,可 ...

随机推荐

  1. 行人重识别(ReID) ——概述

    什么是Re-ID? 行人重识别(Person re-identification,简称Re-ID)也称行人再识别,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术.广泛被认为是一个图像 ...

  2. Winfrom中数据的双向绑定(使用INotifyPropertyChanged)

    在WPF中新建项目是自动实现了INotifyPropertyChanged接口,用于数据绑定时非常的方便在winfrom中也可以实现INotifyPropertyChanged接口 将需要绑定的字段写 ...

  3. day01-html

    HTML概述: HTML: Hyper Text Markup Language 超文本标记语言 超文本: 比普通文本功能更加强大,可以添加各种样式 标记语言: 通过一组标签.来对内容进行描述. &l ...

  4. Sql 统计一个表有多少列

    SELECT COUNT(syscolumns.name) FROM syscolumns , sysobjects WHERE syscolumns.id = sysobjects.id AND s ...

  5. 随笔3 HashMap<K,V>

    equals.hashcode和==的区别 在介绍HashMap之前,我想先阐述一下我对这三者的理解,equals这个方法呢,就是在判断是否为同一对象(注意,这里的同一对象和相同的内存地址是不同的), ...

  6. java四种引用类型以及使用场景详解

    每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”.在 Java 中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(re ...

  7. join优化

    1.left outer join先执行连接操作,再将结果通过WHERE语句进行过滤 select s.ymd,s.symbol,s.price_close,d.dividend from stock ...

  8. Flutter-網絡請求

    Flutter 请求网络的三种方式 flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 HttpClient.第三方网络请求 http以及 Flutter 中的 Dio.我们可以比 ...

  9. jQuery入门、jQuery选择器、jQuery操作

    一.什么是jQuery及如何使用 1.1 jQuery 简介 jQuery是一个兼容多浏览器的javascript函数库(把我们常用的一些功能进行了封装,方便我们来调用,提高我们的开发效率.),核心理 ...

  10. pandas.DataFrame.drop_duplicates 用法说明

    DataFrame.drop_duplicates(subset=None, keep='first', inplace=False) subset考虑重复发生在哪一列,默认考虑所有列,就是在任何一列 ...