题目

【2011集训队出题】聪聪可可

思路

看看做做 阴阳 这道题

极力推荐

自从做了这道题后,这些题就变成秒切的题了

很容易想到求节点到分治中心的距离,然后 \(\bmod 3\)

那么在求根节点一棵子树的答案时直接加上 \(dis[(3-x) mod 3]\) 的个数

用个桶 \(buc\) 来记录,若当前节点的 \(dis \bmod 3\) 后结果为 \(0\),说明它到跟也为合法路径,此时 \(res\) 要额外 \(+1\)

统计完一个子树的贡献后再将子树的信息加入桶中

统计完所有子树,重新选根前再 \(dfs\) 一遍清除 \(buc\)

\(Code\)

#include<cstdio>
#include<iostream>
using namespace std; const int N = 2e4 + 5;
int n , h[N] , tot , size , siz[N] , son[N] , dis[N] , use[N] , ans , rt , buc[5]; struct edge{
int to , nxt , w;
}e[N * 2]; inline void add(int x , int y , int z)
{
e[++tot].to = y;
e[tot].w = z;
e[tot].nxt = h[x];
h[x] = tot;
} inline void getrt(int x , int fa)
{
son[x] = 0 , siz[x] = 1;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa || use[v]) continue;
getrt(v , x);
siz[x] += siz[v];
son[x] = max(son[x] , siz[v]);
}
son[x] = max(son[x] , size - siz[x]);
rt = son[x] < son[rt] ? x : rt;
} inline void getdis(int x , int fa)
{
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa || use[v]) continue;
dis[v] = (dis[x] + e[i].w) % 3;
getdis(v , x);
}
} inline int dfs(int x , int fa)
{
int res = 0;
res += buc[(3 - dis[x]) % 3] + (dis[x] == 0 ? 1 : 0);
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa || use[v]) continue;
res += dfs(v , x);
}
return res;
} inline void fill(int x , int fa)
{
buc[dis[x]]++;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa || use[v]) continue;
fill(v , x);
}
} inline void clear(int x , int fa)
{
buc[dis[x]]--;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa || use[v]) continue;
clear(v , x);
}
dis[x] = 0;
} inline int calc(int x)
{
dis[x] = 0;
getdis(x , 0);
int res = 0;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (use[v]) continue;
res += dfs(v , x) , fill(v , x);
}
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (use[v]) continue;
clear(v , x);
}
return res;
} inline void divide(int x)
{
use[x] = 1 , ans += calc(x);
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (use[v]) continue;
size = siz[v] , rt = 0;
getrt(v , x) , divide(rt);
}
} inline int gcd(int a , int b){return b == 0 ? a : gcd(b , a % b);} int main()
{
scanf("%d" , &n);
int u , v , w;
for(register int i = 1; i < n; i++)
{
scanf("%d%d%d" , &u , &v , &w);
add(u , v , w) , add(v , u , w);
}
son[0] = 2e9 , size = n , rt = 0;
getrt(1 , 0) , divide(rt);
ans = ans * 2 + n;
int tmp = n * n , d = gcd(ans , tmp);
printf("%d/%d" , ans / d , tmp / d);
}

JZOJ 1967.【2011集训队出题】聪聪可可的更多相关文章

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

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

  2. 洛谷 P2634 [国家集训队]聪聪可可 解题报告

    P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一 ...

  3. 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量

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

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

    P2634 [国家集训队]聪聪可可(题解)(点分治) 洛谷题目 #include<iostream> #include<cstdlib> #include<cstdio& ...

  5. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  6. bzoj2152-[国家集训队]聪聪可可

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

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

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

  8. LG2634 [国家集训队]聪聪可可

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

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

    题目传送门 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 5237  Solved: 2750[Submit][Status][Discuss ...

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

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

随机推荐

  1. APACHE快速安装流程梳理

    操作参考教程:https://www.cnblogs.com/haw2106/p/9839655.html 快速安装开始: [环境配置1] yum -y install gcc gcc-c++ wge ...

  2. Zabbix技术分享——docker组件编译使用教程

    docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源,它可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux机器上,还可以实现 ...

  3. 猿人学web爬虫攻防大战

    这里有1.2.3.4.12.13.15题 1.第一题 import execjs import requests def get_response(): js_code = ""& ...

  4. 虚拟网络VLAN

    一.VLAN划分基础 1.VLAN概念 VLAN叫做虚拟局域网,逻辑上将网络划分 2.VLAN的分类 静态vlan:基于端口划分静态VLAN 动态vlan:基于MAC地址划分动态VLAN 3.VLAN ...

  5. 从Qt到C#,通过COM组件达成跨语言跨平台链接,或者说从托管到非托管的思路

    从Qt到C#,通过COM组件达成跨语言跨平台链接,或者说从非托管到托管 写在前面 c#真的是一种非常蛋疼的语言,和别的语言兼容性差,界面开发效率也不是很高,但是胜在库功能强大,对windows的兼容好 ...

  6. Win10下SDK Manager应用程序闪退问题的解决方法

    SDK Manager闪退原因:未找到Java的正确路径 解决办法: 1.在压缩包中找到Android.bat文件,右键编辑 2.打开的Android文件内容,找到如图的几行代码 将上面的代码替换成: ...

  7. [图像处理] YUV图像处理入门1

    目前数字图像处理技术已经应用生活各个方面,但是大部分教程都是利用第三方库(如opencv)对RGB图像格式进行处理.对于YUV图像格式的图像处理教程较少.于是博主搬运总结了多个大牛的文章,总结出来这个 ...

  8. [python] 向量检索库Faiss使用指北

    Faiss是一个由facebook开发以用于高效相似性搜索和密集向量聚类的库.它能够在任意大小的向量集中进行搜索.它还包含用于评估和参数调整的支持代码.Faiss是用C++编写的,带有Python的完 ...

  9. [python] ​Python数据序列化模块pickle使用笔记

    pickle是一个Python的内置模块,用于在Python中实现对象结构序列化和反序列化.Python序列化是一个将Python对象层次结构转换为可以本地存储或者网络传输的字节流的过程,反序列化则是 ...

  10. Spark通信框架RPC介绍

    Spark通信框架RPC介绍 内容安排: 1.RPC原理 2.nio操作 3.netty简单的api 4.自定义RPC框架 RPC原理学习 什么是RPC RPC(Remote Procedure Ca ...