背景:

hehe...hehe...hehe...

题目传送门:

https://www.luogu.org/problemnew/show/P2634

题意:

在树上选两个点权值和是333的倍数的概率。

思路:

点分治模板。
这一就不用两重循环暴力了,因为mod  3=0\mod 3=0mod3=0就两种情况:0+0,1+20+0,1+20+0,1+2(取模后)。统计答案即可。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int n,len=0,ans=0;int last[200010],size[200010],msize[200010],dis[200010];bool bz[200010];struct node{int x,y,z,next;} a[200010];
int SIZE,MIN,ROOT,tot;
void ins(int x,int y,int z)
{a[++len]=(node){x,y,z,last[x]}; last[x]=len;
}
void find_root(int x,int fa)
{size[x]=1;msize[x]=0;for(int i=last[x];i;i=a[i].next){int y=a[i].y;if(y==fa||bz[y]) continue;find_root(y,x);size[x]+=size[y];msize[x]=max(msize[x],size[y]);}msize[x]=max(msize[x],SIZE-size[x]);if(MIN>msize[x]) MIN=msize[x],ROOT=x;
}
void get_dis(int x,int fa,int z)
{dis[++tot]=z;for(int i=last[x];i;i=a[i].next){int y=a[i].y;if(bz[y]||y==fa) continue;get_dis(y,x,z+a[i].z);}
}
int sum[10];
void solve(int x,int z,int op)
{tot=0;get_dis(x,0,z);sum[0]=sum[1]=sum[2]=0;for(int i=1;i<=tot;i++)sum[dis[i]%3]++;ans+=(sum[0]*sum[0]+2*sum[1]*sum[2])*op;
}
void dfs(int x)
{bz[x]=true;solve(x,0,1);for(int i=last[x];i;i=a[i].next){int y=a[i].y;if(bz[y]) continue;solve(y,a[i].z,-1);SIZE=size[y],MIN=SIZE,ROOT=0;find_root(y,0);dfs(ROOT);}
}
int gcd(int x,int y)
{return !y?x:gcd(y,x%y);
}
int main()
{int x,y,z;scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d %d %d",&x,&y,&z);ins(x,y,z),ins(y,x,z);}SIZE=n,MIN=n,ROOT=0;find_root(1,0);dfs(ROOT);int GCD=gcd(ans,n*n);printf("%d/%d",ans/GCD,n*n/GCD);
}

luogu P2634 [国家集训队]聪聪可可相关推荐

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

    luogu P2634 [国家集训队]聪聪可可 点分治 没啥难度,只需将路径取模,开桶,统计 d[0],d[1],d[2] 的值即可. ans = d[1]*d[2]*d[2]+d[0]*d[0] C ...

  2. 题解:luogu P2634 [国家集训队]聪聪可可

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

  3. P2634 [国家集训队]聪聪可可(树上启发式合并)

    P2634 [国家集训队]聪聪可可(树上启发式合并) 题意: 一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个? 输出这样的点对所占比例 题解: 没有修改,统计边长为3的倍数, ...

  4. P2634 [国家集训队]聪聪可可(点分治做法)

    P2634 [国家集训队]聪聪可可 题意: 一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个? 输出这样的点对所占比例 题解: 因为是求三的倍数,我们num来记录%3=0,1, ...

  5. P2634 [国家集训队]聪聪可可

    链接:https://www.luogu.org/problemnew/show/P2634 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人 ...

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

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

  7. BZOJ 2152 「国家集训队」聪聪可可(点分治)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2152 是 hydro 的 BZOJ ...

  8. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  9. P2634 [国家集训队]聪聪可可(树形dp)

    题意: 一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个? 输出这样的点对所占比例 题解: 树形dp求解 因为是求长度为3的倍数,模3的结果只有0/1/2,我们可以单独考虑作为 ...

最新文章

  1. sql server 查看对象最后修改时间
  2. Java中String字符串toString()、String.valueOf()、String强转、+ 的区别
  3. 数据库技能实战进阶之常用结构化sql语句(中)
  4. 你为什么选择计算机应用专业,致新生!我为什么选择信息工程系
  5. 数字图像中高频噪声的滤波
  6. otsu阈值分割算法原理_局部阈值分割算法总结
  7. PMP培训内容有哪些?
  8. [收藏] 今天的存储解决方案:直连式存储(DAS)、存储区域网络(SAN)、网络接入存储(NAS)
  9. 概率论————思维导图(上岸必备)(数字特征)
  10. html font设置字号,html font标签怎么设置字体大小
  11. 【渝粤题库】陕西师范大学165109 绩效管理 作业(高起专)
  12. 执行throw后 后面代码还会执行吗?
  13. 修改蒙特卡洛树搜索让人工智能像人类一样玩视频游戏
  14. mysql中explain执行结果中的rows是什么意思?
  15. 开发一个Android志愿填报系统(后台管理+前台app)毕业设计
  16. Kafka High Level API vs. Low Level API
  17. 十大排序算法代码集锦(java)
  18. 甲骨文大数据利器:内存数据库和一体机
  19. 索引的作用和为什么要创建索引
  20. Linux远程连接服务器

热门文章

  1. [衣裳饰品]谈谈西装、手工西装和西装定制_时尚资讯_天涯论坛
  2. Arishmoon Tony的高考素材本.1
  3. SSM所用jar包总结,外加下载地址
  4. 用计算机弹出黎明的黑暗,STEAM打开黎明杀机启动游戏后弹出计算机丢失msvcp140period;dllperiod; | 手游网游页游攻略大全...
  5. Recycler缓存机制
  6. bochs中的bochsrc文件疑惑
  7. mysql安装 root account password_mysql 配置 安装和 root password 更改
  8. 内网穿透之使用神卓互联V8.5.9客户端访问用友ERP系统
  9. python __slots__
  10. 2021年锂电池下游市场需求分析:传统市场需求稳定 新型应用带来新机遇