洛谷P2634 [国家集训队]聪聪可可 点分治模板
题意
在一棵树上任意选两个点,求它们距离模3为0的概率。
分析
树分治模板
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=2e4+10;
typedef pair<int,int> pii;
vector<pii>g[maxn];
int n,sz[maxn],vis[maxn],maxp[maxn],f[3],c[3],ans,rt,sum;
void getrt(int u,int fa){
sz[u]=1;maxp[u]=0;
for(pii x:g[u]){
if(x.fi==fa||vis[x.fi]) continue;
getrt(x.fi,u);
sz[u]+=sz[x.fi];
maxp[u]=max(maxp[u],sz[x.fi]);
}
maxp[u]=max(maxp[u],sum-sz[u]);
if(maxp[u]<maxp[rt]) rt=u;
}
void getdis(int u,int fa,int d){
f[d%3]++;
for(pii x:g[u]){
if(x.fi==fa||vis[x.fi]) continue;
getdis(x.fi,u,d+x.se);
}
}
void calc(int u){
for(pii x:g[u]){
if(vis[x.fi]) continue;
f[0]=f[1]=f[2]=0;
getdis(x.fi,u,x.se);
ans+=f[0]*c[0]*2+f[1]*c[2]*2+f[2]*c[1]*2;
c[0]+=f[0];c[1]+=f[1];c[2]+=f[2];
}
c[0]=1;c[1]=c[2]=0;
}
void solve(int u){
vis[u]=c[0]=1;calc(u);
for(pii x:g[u]){
if(vis[x.fi]) continue;
sum=sz[x.fi],maxp[rt=0]=inf;
getrt(x.fi,0);solve(rt);
}
}
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
int main(){
ios::sync_with_stdio(false);
//freopen("in","r",stdin);
cin>>n;
for(int i=1,x,y,w;i<n;i++){
cin>>x>>y>>w;
g[x].pb(pii(y,w));g[y].pb(pii(x,w));
}
sum=maxp[rt]=n;
getrt(1,0);solve(rt);
int a=ans+n,b=n*n;
int t=gcd(a,b);
a/=t;b/=t;
cout<<a<<'/'<<b<<endl;
return 0;
}
洛谷P2634 [国家集训队]聪聪可可 点分治模板的更多相关文章
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- 洛谷 P2634 [国家集训队]聪聪可可 解题报告
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一 ...
- 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- 洛谷P2634 [国家集训队]聪聪可可 (点分治)
题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...
- 洛谷-P2634 [国家集训队]聪聪可可 点分治
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...
- [洛谷P2634][国家集训队]聪聪可可
题目大意:给你一棵树,随机选两个点,求它们之间路径长度是$3$的倍数的概率 题解:点分治,求出当前状态的重心,然后求出经过重心的答案,接着分治每棵子树.注意考虑重复计算的情况 卡点:无 C++ Cod ...
- 洛谷 P2634 [国家集训队]聪聪可可
点分板子2333 注释都是错过的地方 #include<cstdio> #include<algorithm> using namespace std; typedef lon ...
- 洛谷P2634 [国家集训队]聪聪可可(点分治)
传送门 题意: 给出一颗树,每条边都有一定的边权. 先问点之间路径和为\(3\)的倍数的点对有多少. 思路: 点分治模板题. 可以将问题转化为经过一个点\(t\)的路径和不经过点\(t\)的路径两种情 ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
随机推荐
- python学习-2 python安装和环境变量的设置
python的下载 1.可以去python官网下载,https://www.python.org/ 2.下载完成后,安装即可.(具体可以百度,网上都有很多安装方法) python的检测 1.打开开始- ...
- docker 入门3 - 服务 【翻译】
入门,第 3 部分:服务 先决条件 安装 Docker 版本 1.13 或更高版本. 获取 Docker Compose.在适用于 Mac 和 Docker 桌面的 Windows 上,它已预安装,因 ...
- 怎样获取所有的script节点
1. 使用document.scripts; document.scripts instanceof HTMLCollection; // true 2. 使用 document.getElement ...
- python 的常见排序算法实现
python 的常见排序算法实现 参考以下链接:https://www.cnblogs.com/shiluoliming/p/6740585.html 算法(Algorithm)是指解题方案的准确而完 ...
- Oracle 分页语句
** 写法1 :采用 ROWNUM的伪列: --查询10到20之间的数据 -- SELECT * FORM ( -- SELECT * , ROWNUM rn FROM TABLE_NAME -- W ...
- KEIL仿真出现 EVALUATION MODE
原因是KEIL MDK没有破解,重新破解即可
- set 集合的函数调用
方法 意义 S.add(e) 在集合中添加一个新的元素e:如果元素已经存在,则不添加 S.remove(e) 从集合中删除一个元素,如果元素不存在于集合中,则会产生一个KeyError错误 S.dis ...
- WebLogic 12c Linux 命令行 静默安装
CentOS 6.3安装配置Weblogic 10 http://www.linuxidc.com/Linux/2014-02/96918.htm Oracle WebLogic 11g 安装部署文 ...
- Image Processing and Analysis_8_Edge Detection:Scale-space and edge detection using anisotropic diffusion——1990
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- C#编程 LINQ查询
LINQ查询表达式 约束 LINQ查询表达式必须以from子句开头,以select或group子句结束 关键字 from...in...:指定要查找的数据以及范围变量,多个from子句则表示从多个数据 ...