luogu P2634 [国家集训队]聪聪可可
背景:
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 [国家集训队]聪聪可可相关推荐
- luogu P2634 [国家集训队]聪聪可可 点分治
luogu P2634 [国家集训队]聪聪可可 点分治 没啥难度,只需将路径取模,开桶,统计 d[0],d[1],d[2] 的值即可. ans = d[1]*d[2]*d[2]+d[0]*d[0] C ...
- 题解:luogu P2634 [国家集训队]聪聪可可
题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...
- P2634 [国家集训队]聪聪可可(树上启发式合并)
P2634 [国家集训队]聪聪可可(树上启发式合并) 题意: 一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个? 输出这样的点对所占比例 题解: 没有修改,统计边长为3的倍数, ...
- P2634 [国家集训队]聪聪可可(点分治做法)
P2634 [国家集训队]聪聪可可 题意: 一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个? 输出这样的点对所占比例 题解: 因为是求三的倍数,我们num来记录%3=0,1, ...
- P2634 [国家集训队]聪聪可可
链接:https://www.luogu.org/problemnew/show/P2634 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人 ...
- 洛谷P2634 [国家集训队]聪聪可可(点分治)
聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了 ...
- BZOJ 2152 「国家集训队」聪聪可可(点分治)【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2152 是 hydro 的 BZOJ ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- P2634 [国家集训队]聪聪可可(树形dp)
题意: 一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个? 输出这样的点对所占比例 题解: 树形dp求解 因为是求长度为3的倍数,模3的结果只有0/1/2,我们可以单独考虑作为 ...
最新文章
- sql server 查看对象最后修改时间
- Java中String字符串toString()、String.valueOf()、String强转、+ 的区别
- 数据库技能实战进阶之常用结构化sql语句(中)
- 你为什么选择计算机应用专业,致新生!我为什么选择信息工程系
- 数字图像中高频噪声的滤波
- otsu阈值分割算法原理_局部阈值分割算法总结
- PMP培训内容有哪些?
- [收藏] 今天的存储解决方案:直连式存储(DAS)、存储区域网络(SAN)、网络接入存储(NAS)
- 概率论————思维导图(上岸必备)(数字特征)
- html font设置字号,html font标签怎么设置字体大小
- 【渝粤题库】陕西师范大学165109 绩效管理 作业(高起专)
- 执行throw后 后面代码还会执行吗?
- 修改蒙特卡洛树搜索让人工智能像人类一样玩视频游戏
- mysql中explain执行结果中的rows是什么意思?
- 开发一个Android志愿填报系统(后台管理+前台app)毕业设计
- Kafka High Level API vs. Low Level API
- 十大排序算法代码集锦(java)
- 甲骨文大数据利器:内存数据库和一体机
- 索引的作用和为什么要创建索引
- Linux远程连接服务器
热门文章
- [衣裳饰品]谈谈西装、手工西装和西装定制_时尚资讯_天涯论坛
- Arishmoon Tony的高考素材本.1
- SSM所用jar包总结,外加下载地址
- 用计算机弹出黎明的黑暗,STEAM打开黎明杀机启动游戏后弹出计算机丢失msvcp140period;dllperiod; | 手游网游页游攻略大全...
- Recycler缓存机制
- bochs中的bochsrc文件疑惑
- mysql安装 root account password_mysql 配置 安装和 root password 更改
- 内网穿透之使用神卓互联V8.5.9客户端访问用友ERP系统
- python __slots__
- 2021年锂电池下游市场需求分析:传统市场需求稳定 新型应用带来新机遇