传送门
写在前面:╯﹏╰
思路:刚开始char哥在做这个题,提供了不用点分治而是树上递推的做法,然后我就先调出来了……
对树进行dfs,f[u][y]表示以x为根的子树中,与u距离为y的点(mod 3),g[u]为以x为根的子树中符合条件的点对(不包含(1,1),(2,2)……),那么最后答案就是((g[1]+n)/gcd,n∗n/gcd)((g[1]+n)/gcd,n*n/gcd)
f的递推式还是比较好想的
f[u][w(u,v)+y]=∑f[v][y]v为x的儿子f[u][w(u,v)+y]=∑f[v][y] v为x的儿子
g的递推式有些细节,首先在统计3种点对(在mod3情况下为0,1,2)时,分成LCA为u的点对和LCA不为u的点对(实际上就是一棵子树中原本有的点对和两个子树间的点对)
前者直接加g[v]就好了
后者则是利用乘法原理,比如第一棵子树中与u距离为1(mod 3)的点有3个,其他子树(不能包含第一棵子树中的点,因为已经在dfs第一棵子树的时候统计过了,我们要求的是LCA不为u的点对!)中与u距离为2的点有2个,那么g[u]+=2*3,同时值得注意的是,在计算距离为0的点时,u也是要算进去的,但计算一次子树时它只能算一次(好可怜啊),其他点在循环后都算了两次的,所以我们计算时要加个一
注意:都说过了……
代码:

#include<bits/stdc++.h>
using namespace std;
int tot,g[20010],f[20010][3],first[20010],n,x,y,z;
int fa[20010];
struct edge
{int u,v,w,next;
}e[40010];
void add(int x,int y,int z)
{e[++tot].u=x;e[tot].v=y;e[tot].w=z;e[tot].next=first[x];first[x]=tot;
}
void dfs(int x)
{for (int i=first[x];i;i=e[i].next)if (fa[x]!=e[i].v){fa[e[i].v]=x;dfs(e[i].v);f[x][e[i].w]+=f[e[i].v][0];f[x][(e[i].w+1)%3]+=f[e[i].v][1];f[x][(e[i].w+2)%3]+=f[e[i].v][2];}for (int i=first[x];i;i=e[i].next)if (fa[x]!=e[i].v){g[x]+=g[e[i].v];g[x]+=(f[x][0]-f[e[i].v][(3-e[i].w)%3]+1)*f[e[i].v][(3-e[i].w)%3];//这就是我们刚才说的问题,(u,x)和(x,u)都是要算的g[x]+=(f[x][1]-f[e[i].v][(4-e[i].w)%3])*f[e[i].v][(5-e[i].w)%3];g[x]+=(f[x][2]-f[e[i].v][(5-e[i].w)%3])*f[e[i].v][(4-e[i].w)%3];}
}
int gcd(int x,int y)
{if (!y) return x;return gcd(y,x%y);
}
main()
{scanf("%d",&n);for (int i=1;i<n;i++)scanf("%d%d%d",&x,&y,&z),z%=3,add(x,y,z),add(y,x,z);for (int i=1;i<=n;i++) f[i][0]=1;dfs(1);int p=gcd(g[1]+n,n*n);printf("%d/%d",(g[1]+n)/p,n*n/p);
}

附样例

6
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
7/189
1 2 1
1 3 2
2 4 1
2 5 2
4 6 1
4 7 2
4 8 0
3 9 1
11/275
1 2 1
1 3 2
2 4 1
2 5 2
11/253
1 2 0
2 3 0
1/1

在没学过一个算法时,我们并不要畏惧它,甚至连看都不敢看(至少想想如果在考场上遇到,暴力该怎么打吧……)另辟蹊径,也能走出一片天地

【BZOJ2152】聪聪可可,dfs+递推/点分治相关推荐

  1. [DFS/递推/DP] 2327 [SCOI2005] 扫雷 ( 普及+/提高

    Date:2019/10/13 Degree of difficulty:Universal Original question:P2327 [SCOI2005]扫雷 原题与改编 10.13月考[爆零 ...

  2. NKOJ 3893 聪聪和可可(数学期望+递推+最短路)

    P3893[概率]聪聪和可可 问题描述 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和 ...

  3. bzoj2152 聪聪可可

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

  4. BZOJ2152 聪聪可可(点分治)

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

  5. BZOJ2152 聪聪可可 点分治题解

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

  6. [题解]bzoj2152 聪聪可可

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

  7. 【bzoj2152】【聪聪可可】

    2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MB Submit: 924 Solved: 487 [Submit][Status][Discuss] ...

  8. 题解报告——聪聪与可可

    题目传送门 题目描述 在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可.虽 然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠, 同样不变的是,聪聪成天想着要吃掉可可. ...

  9. bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415 noip2016 D1T3,多么痛的领悟...看来要恶补一下与期望相关的东西了. 这是 ...

最新文章

  1. uitableview 默认选中行
  2. 中国自研数据库拿下世界第一,背后这十年都经历了什么?
  3. Missing artifact log4j:log4j:bundle:1.2.17
  4. 使用ASP.NET Core 3.x 构建 RESTful API - 1. 开始
  5. 查看端口是否被占用,以及端口的应用名称
  6. bzoj 4895: 项链分赃(增强版)
  7. 十五天精通WCF——第十三天 用WCF来玩Rest
  8. 走进AngularJs(一)angular基本概念的认识与实战
  9. (转)如何在windows 2008 安装IIS
  10. Set和Map的区别 (@es6)
  11. DBeaver-调整字体
  12. 在html中加入文本编辑器,富文本编辑器嵌入指定html代码
  13. 如何批量将图片转换为 PDF 文档
  14. 用 Python 制作各种用途的二维码
  15. deeplearning.14深度学习猫咪识别阶段性检测记录
  16. 7 款基于 HTML5 Canvas 的超炫 3D 动画效果
  17. 智能家居的分类有哪些?
  18. 解决 Psycopg2 install失败(针对MAC)
  19. 手把手带你 arduino 开发:基于ESP32S 的第一个应用-红外测温枪(带引脚图)
  20. Ubuntu20.04更换软件源之后apt-get update报错

热门文章

  1. php中购物车功能,php如何实现购物车功能
  2. java map 缓存池_map端合并(分布式缓存)
  3. c语言sqlserver进行odbc编程,在VS下用C语言连接SQLServer2008
  4. 代数学笔记10.1: 关于对称多项式的理解和三次预解式的推导
  5. 小米自然语言处理工程师招聘条件与自己的对应整理(第二次更新)
  6. 四路智能抢答器电子系统综合设计
  7. 【java基础知识】连接mysql的工具类编写
  8. IE与FF脚本兼容性问题
  9. 无损链接分解_一点都不能少!伯克利研究人员提出深度学习锻造无损数据压缩新方法...
  10. Eclipse快捷键的使用