luoguP2634聪聪可可(点分治)
题目链接: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代码:
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int maxn=;
- const int inf=0x3f3f3f3f;
- struct node1{
- int v,w,nex;
- }edge[maxn<<];
- int n,ans,cnt,head[maxn],sz[maxn],mson[maxn],Min,root,size;
- int vis[maxn],t,dis[maxn],num[];
- void adde(int u,int v,int w){
- edge[++cnt].v=v;
- edge[cnt].w=w;
- edge[cnt].nex=head[u];
- head[u]=cnt;
- }
- int gcd(int a,int b){
- return b?gcd(b,a%b):a;
- }
- void getroot(int u,int fa){
- sz[u]=,mson[u]=;
- for(int i=head[u];i;i=edge[i].nex){
- int v=edge[i].v;
- if(vis[v]||v==fa) continue;
- getroot(v,u);
- sz[u]+=sz[v];
- if(sz[v]>mson[u]) mson[u]=sz[v];
- }
- if(size-sz[u]>mson[u]) mson[u]=size-sz[u];
- if(mson[u]<Min) Min=mson[u],root=u;
- }
- void getdis(int u,int fa,int len){
- dis[++t]=len;
- for(int i=head[u];i;i=edge[i].nex){
- int v=edge[i].v;
- if(vis[v]||v==fa) continue;
- getdis(v,u,(len+edge[i].w)%);
- }
- }
- void solve(int x,int y,int f){
- t=;
- getdis(x,,y);
- num[]=num[]=num[]=;
- for(int i=;i<=t;++i)
- ++num[dis[i]];
- ans+=(num[]-)*num[]/*f;
- ans+=num[]*num[]*f;
- }
- void fenzhi(int u,int ssize){
- vis[u]=;
- solve(u,,);
- for(int i=head[u];i;i=edge[i].nex){
- int v=edge[i].v;
- if(vis[v]) continue;
- solve(v,edge[i].w%,-);
- Min=inf,root=;
- size=sz[v]<sz[u]?sz[v]:(ssize-sz[u]);
- getroot(v,);
- fenzhi(root,size);
- }
- }
- int main(){
- scanf("%d",&n);
- for(int i=;i<n;++i){
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- adde(u,v,w%);
- adde(v,u,w%);
- }
- Min=inf,root=,size=n;
- getroot(,);
- fenzhi(root,n);
- ans=*ans+n;
- int tmp1=gcd(ans,n*n);
- ans/=tmp1;
- int tmp2=n*n/tmp1;
- printf("%d/%d\n",ans,tmp2);
- return ;
- }
luoguP2634聪聪可可(点分治)的更多相关文章
- [bzoj2152][聪聪和可可] (点分治+概率)
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...
- BZOJ 2152: 聪聪可可 树分治
2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- 【BZOJ】2152: 聪聪可可(点分治)
http://www.lydsy.com/JudgeOnline/problem.php?id=2152 随便点分..... 只是我在考虑一个地方逗乐.. 当路径长度mod3=0的点数直接乘起来就好. ...
- BZOJ 2152: 聪聪可可 点分治
2152: 聪聪可可 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...
- bzoj 2152: 聪聪可可 树的点分治
2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 485 Solved: 251[Submit][Status] Descripti ...
- 洛谷 2634&&BZOJ 2152: 聪聪可可【点分治学习+超详细注释】
2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 3435 Solved: 1776[Submit][Status][Discuss ...
- 【BZOJ2152】聪聪可可(点分治)
[BZOJ2152]聪聪可可(点分治) 题面 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电 ...
- BZOJ_2152_聪聪可可_点分治
BZOJ_2152_聪聪可可_点分治 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)…… ...
- BZOJ2152[国家集训队]聪聪可可——点分治
题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...
- bzoj2152 / P2634 [国家集训队]聪聪可可(点分治)
P2634 [国家集训队]聪聪可可 淀粉质点分治板子 边权直接 mod 3 直接点分治统计出所有的符合条件的点对再和总方案数约分 至于约分.....gcd搞搞就好辣 #include<iostr ...
随机推荐
- BZOJ 1867 [Noi1999]钉子和小球 DP
想状态和钉子的位置如何匹配想了半天...后来发现不是一样的吗$qwq$ 思路:当然是$DP$啦 提交:>5次(以为无故$RE$,实则是先乘后除爆了$long\space long$) 题解: 若 ...
- 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 ...
- mysql:unknown variable 'default-character-set=utf8'
1.修改my.cnf后,执行 service mysql restart 重启数据库失败 service mysql restart Shutting down MySQL.. SUCCESS! St ...
- POJ3764
题目 POJ3764 The xor-longest Path 原题传送门 主要思路: 1.求出每个点到根节点(这里是树,所以直接取0)路径上所有权值xor和为d[i],则任意两点间路径xor和则为 ...
- python获取最大值
python2 中获取int最大值 import sys print sys.maxint 但是在python3中,报错: AttributeError: module 'sys' has no at ...
- 巨丑vue
<template> <div> <div class="demo-type" align="right" style=" ...
- 第11组 Alpha冲刺(1/6)
队名 不知道叫什么团队 组长博客 组长博客 作业博客 https://edu.cnblogs.com/campus/fzu/SE_FZU_1917_K/homework/9938 项目情况 燃尽图 陈 ...
- LeetCode 160. 相交链表(Intersection of Two Linked Lists)
题目描述 编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: ...
- 移动端——link标签
meta标签中提到了部分功能要结合link标签进行使用,link标签主要是存放CSS文件的地方,同时还有一些专属的移动端设置. <meta http-equiv="Content-Ty ...
- [go]gorhill/cronexpr用go实现crontab
// crontab基础 // linux crontab // 秒粒度, 年配置(2018-2099) // 哪一分钟(0-59),哪小时(0-23),哪天(1-31),哪月(1-12),星期几(0 ...