点分治练习——BZOJ 2152
做的第二道点分治的题目,比较裸,算是模板题吧(感觉比之前那题还简单点。
题目大意:给出一棵树,求树上两点间长度为3的倍数(0也算)的路径数。
解题思路:
基本和POJ1741一样
2.不过重心,在重心的子树中
情况二可通过分治转化为情况1。
通过dfs求出每个点到重心的距离%3,将余数是1的和是2的配对,余数是0的两两配对,得出路径数。
同样的,注意去重。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; struct edge{
int w,to,next;
}e[]; int head[],s[],f[],d[],t[],ans,size;
bool b[];
int n,i,j,v,w,x,y,ne=,root; void add(int a,int b,int c){
e[++ne].to=b; e[ne].w=c; e[ne].next=head[a]; head[a]=ne;
} void getroot(int k,int fa){
int v,i;
s[k]=;f[k]=;
for(i=head[k];i!=-;i=e[i].next){
v=e[i].to;
if(v!=fa&&!b[v]){
getroot(v,k);
s[k]+=s[v];
f[k]=max(f[k],s[v]);
}
}
f[k]=max(f[k],size-s[k]);
if(f[k]<f[root])root=k;
} void getdis(int k,int fa){
int v,i;
t[d[k]]++;//将对应余数的数目+1;
for(i=head[k];i!=-;i=e[i].next){
v=e[i].to;
if (v!=fa&&!b[v]){
d[v]=(d[k]+e[i].w)%;
getdis(v,k);
}
}
} int clac(int k,int init){
t[]=t[]=t[]=;//余数清0
d[k]=init%;
getdis(k,);//计算深度
return (t[]*t[]*+t[]*t[]);//计算路径数
} void work(int k){
int i,v;
ans+=clac(k,);//更新ans
b[k]=true;
for(i=head[k];i!=-;i=e[i].next){
v=e[i].to;
if(!b[v]){
ans-=clac(v,e[i].w);//去重
f[]=size=s[v];
root=;
getroot(v,);//更新重心
work(root);//求解子树
}
}
} int gcd(int a,int b){
if(b==) return a;
return gcd(b,a%b);
} int main(){
ans=root=;
memset(head,-,sizeof(head));
memset(b,,sizeof(b));
scanf("%d",&n);
for(i=;i<n;i++){
scanf("%d%d%d",&x,&y,&w);
w%=;
add(x,y,w);
add(y,x,w);//连双向边
}
f[]=size=n;
getroot(,);//求重心
work(root);
int tmp=gcd(ans,n*n);
printf("%d/%d\n",ans/tmp,n*n/tmp);
}
点分治练习——BZOJ 2152的更多相关文章
- bzoj 2152聪聪可可
2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MB Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰 ...
- BZOJ 2152: 聪聪可可 树分治
2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- 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 ...
- BZOJ 2152 聪聪可可(点分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2152 [题目大意] 给出一棵树,问任取两点之间距离为3的倍数的概率是多少 [题解] 树 ...
- [国家集训队][bzoj 2152] 聪聪可可 [点分治]
题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2152 思路: 题目要求统计书上路径信息,想到树上分治算法 实际上这是一道点分治裸题,我就不瞎 ...
- bzoj 2152 聪聪可可(点分治模板)
2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 3194 Solved: 1647[Submit][Status][Discuss ...
- BZOJ 2152 & 点分治
Description: 只是打法法塔前测试一下板子 Code: /*================================= # Created time: 2016-04-20 14:3 ...
随机推荐
- 吴裕雄--天生自然MySQL学习笔记:MySQL ALTER命令
需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. root@host# mysql -u root -p password; Enter password:******* ...
- Android aar同步Failed to resolve: :nuisdk:
在app.gradle中android.dependencies同一级别下加入: repositories { flatDir { dirs 'libs' } }
- CSS3 box-shadow 效果大全(内阴影,外阴影,三边阴影,双边阴影,单边阴影,细线描边…)
/* offset-x | offset-y | color */ box-shadow: 60px -16px teal; /* offset-x | offset-y | blur-radius ...
- Mybatis实现联合查询(六)
1. 疑问 在之前的章节中我们阐述了如何用Mybatis实现检查的查询,而我们实际的需求中,绝大部分查询都不只是针对单张数据表的简单查询,所以我们接下来要看一下Mybatis如何实现联合查询. 2. ...
- 杂记 -- 关于less在vue项目中的使用
1.安装less,less-loader npm install less less-loader --save 2.配置wepack.js(vue3+版本中不用自己设置) //添加less路径模块 ...
- 在storyboard中给控制器添加导航栏控制器和标签控制器
1.选中目标控制器 2.选择xcode的工具栏中的"Editor"->"Embed in"->"Navigation Controller ...
- hdu1066 Last non-zero Digit in N!(求阶乘最后一位不为0的数字)
http://acm.hdu.edu.cn/showproblem.php?pid=1066 转自:https://blog.csdn.net/fengyu0556/article/details/5 ...
- c语言中常用的串运算
调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from) 串连接,strca ...
- axios新手实践实现登陆
其实像这类的文章网上已经有很多很好的,写这篇文章,相当于是做个笔记,以防以后忘记 用到的:1. vuex 2.axios 3.vue-route 登陆流程为:1.提交登陆表单,拿到后台返回的数据 2. ...
- sol - 0x63
[例题]巡逻 注意到K只能是1或2,也就是说只能建0/1/2条新道路 我们分类讨论 当修建0条新道路的时候, 执行遍历会恰好遍历到每条边2次,答案为2*(n-1) 当修建1条新道路的时候, 我们设新道 ...