题目链接:https://www.luogu.org/problem/P2634

题意:给一颗树,求距离的模3为0的点对数量,注意(1,1)算一个点对,(1,2)和(2,1)算两个点对。

思路:和点分治模板题很像,那个是求距离为k的点对数,这题更简单一点,求距离模3为0的点对数。还是一般的套路,求重心,计算点到重心的距离模3的值dis[i],然后用num[i]统计dis=i的点数,然后加上所有组合,即(num[0]-1)*num[0]/2+num[1]*num[2],然后减去在同一个子树中的不合法组合。最后因为我们求的是不同点对数,需要乘2,再加上n(自己和自己组成的点对)。

AC代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4.  
  5. const int maxn=;
  6. const int inf=0x3f3f3f3f;
  7. struct node1{
  8. int v,w,nex;
  9. }edge[maxn<<];
  10.  
  11. int n,ans,cnt,head[maxn],sz[maxn],mson[maxn],Min,root,size;
  12. int vis[maxn],t,dis[maxn],num[];
  13.  
  14. void adde(int u,int v,int w){
  15. edge[++cnt].v=v;
  16. edge[cnt].w=w;
  17. edge[cnt].nex=head[u];
  18. head[u]=cnt;
  19. }
  20.  
  21. int gcd(int a,int b){
  22. return b?gcd(b,a%b):a;
  23. }
  24.  
  25. void getroot(int u,int fa){
  26. sz[u]=,mson[u]=;
  27. for(int i=head[u];i;i=edge[i].nex){
  28. int v=edge[i].v;
  29. if(vis[v]||v==fa) continue;
  30. getroot(v,u);
  31. sz[u]+=sz[v];
  32. if(sz[v]>mson[u]) mson[u]=sz[v];
  33. }
  34. if(size-sz[u]>mson[u]) mson[u]=size-sz[u];
  35. if(mson[u]<Min) Min=mson[u],root=u;
  36. }
  37.  
  38. void getdis(int u,int fa,int len){
  39. dis[++t]=len;
  40. for(int i=head[u];i;i=edge[i].nex){
  41. int v=edge[i].v;
  42. if(vis[v]||v==fa) continue;
  43. getdis(v,u,(len+edge[i].w)%);
  44. }
  45. }
  46.  
  47. void solve(int x,int y,int f){
  48. t=;
  49. getdis(x,,y);
  50. num[]=num[]=num[]=;
  51. for(int i=;i<=t;++i)
  52. ++num[dis[i]];
  53. ans+=(num[]-)*num[]/*f;
  54. ans+=num[]*num[]*f;
  55. }
  56.  
  57. void fenzhi(int u,int ssize){
  58. vis[u]=;
  59. solve(u,,);
  60. for(int i=head[u];i;i=edge[i].nex){
  61. int v=edge[i].v;
  62. if(vis[v]) continue;
  63. solve(v,edge[i].w%,-);
  64. Min=inf,root=;
  65. size=sz[v]<sz[u]?sz[v]:(ssize-sz[u]);
  66. getroot(v,);
  67. fenzhi(root,size);
  68. }
  69. }
  70.  
  71. int main(){
  72. scanf("%d",&n);
  73. for(int i=;i<n;++i){
  74. int u,v,w;
  75. scanf("%d%d%d",&u,&v,&w);
  76. adde(u,v,w%);
  77. adde(v,u,w%);
  78. }
  79. Min=inf,root=,size=n;
  80. getroot(,);
  81. fenzhi(root,n);
  82. ans=*ans+n;
  83. int tmp1=gcd(ans,n*n);
  84. ans/=tmp1;
  85. int tmp2=n*n/tmp1;
  86. printf("%d/%d\n",ans,tmp2);
  87. return ;
  88. }

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

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

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

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

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

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

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

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

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

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

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

  6. 洛谷 2634&&BZOJ 2152: 聪聪可可【点分治学习+超详细注释】

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 3435  Solved: 1776[Submit][Status][Discuss ...

  7. 【BZOJ2152】聪聪可可(点分治)

    [BZOJ2152]聪聪可可(点分治) 题面 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电 ...

  8. BZOJ_2152_聪聪可可_点分治

    BZOJ_2152_聪聪可可_点分治 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)…… ...

  9. BZOJ2152[国家集训队]聪聪可可——点分治

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

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

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

随机推荐

  1. BZOJ 1867 [Noi1999]钉子和小球 DP

    想状态和钉子的位置如何匹配想了半天...后来发现不是一样的吗$qwq$ 思路:当然是$DP$啦 提交:>5次(以为无故$RE$,实则是先乘后除爆了$long\space long$) 题解: 若 ...

  2. LoadLibrary(C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll) error: 找不到指定的模块。 C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll: can't load file LoadLibrary(C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll) erro

    LoadLibrary(C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll) error: 找不到指定的模块. C:\soft\IDA 7.0\IDA 7.0\p ...

  3. mysql:unknown variable 'default-character-set=utf8'

    1.修改my.cnf后,执行 service mysql restart 重启数据库失败 service mysql restart Shutting down MySQL.. SUCCESS! St ...

  4. POJ3764

    题目 POJ3764 The xor-longest Path 原题传送门 主要思路: 1.求出每个点到根节点(这里是树,所以直接取0)路径上所有权值xor和为d[i],则任意两点间路径xor和则为 ...

  5. python获取最大值

    python2 中获取int最大值 import sys print sys.maxint 但是在python3中,报错: AttributeError: module 'sys' has no at ...

  6. 巨丑vue

    <template> <div> <div class="demo-type" align="right" style=" ...

  7. 第11组 Alpha冲刺(1/6)

    队名 不知道叫什么团队 组长博客 组长博客 作业博客 https://edu.cnblogs.com/campus/fzu/SE_FZU_1917_K/homework/9938 项目情况 燃尽图 陈 ...

  8. LeetCode 160. 相交链表(Intersection of Two Linked Lists)

    题目描述 编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: ...

  9. 移动端——link标签

    meta标签中提到了部分功能要结合link标签进行使用,link标签主要是存放CSS文件的地方,同时还有一些专属的移动端设置. <meta http-equiv="Content-Ty ...

  10. [go]gorhill/cronexpr用go实现crontab

    // crontab基础 // linux crontab // 秒粒度, 年配置(2018-2099) // 哪一分钟(0-59),哪小时(0-23),哪天(1-31),哪月(1-12),星期几(0 ...