bzoj2152 树分治
还是太菜了,自己写的wa,但是找不到哪里错了,,
感觉现在学树分治早了点。。以后回来再看吧
/*
多少点对之间的路径是3的倍数
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#include<algorithm>
#define MAXN 20010
int N;
struct E{
int v,next,w;
}edge[MAXN<<];
int head[MAXN],tot;
int size[MAXN];
int maxv[MAXN];
int vis[MAXN];
int dis[MAXN];
int num,ans,Max,root;
void init(){
tot=ans=;
memset(head,-,sizeof head);
memset(vis,,sizeof vis);
}
void addedge(int u,int v,int w){
edge[tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
//一次dfs处理子树的大小
void dfssize(int u,int f){
size[u]=;
maxv[u]=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v==f||vis[v]) continue;
dfssize(v,u);
size[u]+=size[v];
maxv[u]=max(maxv[u],size[v]);
}
}
//一次dfs找重心
void dfsroot(int r,int u,int f){
maxv[u]=max(maxv[u],size[r]-maxv[u]);
if(maxv[u]<Max)
Max=maxv[u],root=u;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v==f||vis[v])
continue;
dfsroot(r,v,u);
}
}
int tmp[];
//一次dfs求路径长度
void dfsdis(int u,int d,int f){
dis[u]=d%;
tmp[dis[u]]++;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v==f||vis[v])
continue;
dfsdis(v,d+edge[i].w,u);
}
}
//计算以u为根的子树中有多少点对的距离%3==0
int calc(int u,int d){
tmp[]=tmp[]=tmp[]=;
dfsdis(u,d,-);//得到dis数组
return tmp[]*tmp[]+tmp[]*tmp[]*;
}
//分治
void dfs(int u){
Max=N;
dfssize(u,-);
dfsroot(u,u,-);
ans+=calc(root,);
vis[root]=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(vis[v])
continue;
ans-=calc(v,edge[i].w);
dfs(v);
}
} int gcd(int a,int b){
if(b==) return a;
else return gcd(b,a%b);
}
int main(){
scanf("%d",&N);
init();
for(int i=;i<=N-;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w%);
addedge(v,u,w%);
}
dfs();
int g=gcd(ans,N*N);
printf("%d/%d",ans/g,N*N/g);
return ;
}
bzoj2152 树分治的更多相关文章
- bzoj2152: 聪聪可可 树分治
sb树分治 /************************************************************** Problem: 2152 User: walfy Lang ...
- hdu-5977 Garden of Eden(树分治)
题目链接: Garden of Eden Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- 【BZOJ-1468】Tree 树分治
1468: Tree Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1025 Solved: 534[Submit][Status][Discuss] ...
- HDU 4812 D Tree 树分治+逆元处理
D Tree Problem Description There is a skyscraping tree standing on the playground of Nanjing Unive ...
- BZOJ 2152: 聪聪可可 树分治
2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- POJ 1741 Tree 树分治
Tree Description Give a tree with n vertices,each edge has a length(positive integer less than 1 ...
- UVALive 7148 LRIP【树分治+线段树】
题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...
- BZOJ 2566 xmastree(树分治+multiset)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2566 题意:一棵有边权的树.结点有颜色.每次修改一个点的颜色.求每次修改后所有同色 ...
- 树分治&树链剖分相关题目讨论
预备知识 树分治,树链剖分 poj1741 •一棵有n个节点的树,节点之间的边有长度.方方方想知道,有多少个点对距离不超过m 题解 点分治模板题.详见我早上写的http://www.cnblogs ...
随机推荐
- jsp中的request.getContextPath()
jsp中的request.getContextPath() <%=request.getContextPath()%>是为了解决相对路径的问题,可返回站点的根路径. 但不用也可以吧,比 ...
- redis工具类 ----RedisPoolUtil
这里介绍一下,这个工具类不是在分布式环境下来用的,就是我们平常使用的,单机状况下,为什么博主开头要这样强调呢?因为,之前见网上有些博友有这样封装的,也有RedisShardedPoolUtil 封装的 ...
- HDU - 3478 Catch(判奇环/二分图)
http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意 给一个无向图和小偷的起点,小偷每秒可以向相邻的点出发,问有没有一个时间点小偷可能出现在任何点. 分析 ...
- Linux 命令详解(二)awk 命令
AWK是一种处理文本文件的语言,是一个强大的文本分析工具.之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Fami ...
- AWT和Swing的关系
1.AWT和Swing都是java中的包. 2.AWT(Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包,AWT是通过调用操作系统的native方法实现的 ...
- Spring 学习04
一.上节内容回顾 1 基于aspectj的注解aop操作 2 spring的jdbcTemplate操作 (1)实现crud操作 - 添加.修改.删除update方法 - 查询 -- 查询某个值 qu ...
- c/s 给 服务器上传文件(c/s和b/s互传文件)
//c/s 代码 private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = ne ...
- Netty入门(2) - 核心概念
Netty Crash Course 一个Netty程序一般开始于Bootstrap类,通过设置程序后,使用Handlers来处理特定的event和设置Netty中的事件,从而处理多个协议数据,比如实 ...
- CSS之清除浮动(span/clearfix)
一.问题描述 web网页设计中,在div元素中有时候常伴有图文结合的post组件.为了使得文本在图像周围环绕,那么需要对图像区域使用float浮动.如果不做清除浮动,则会出现如下结果: 图像比文本高, ...
- NodeJs进击,新建一个Node Server
直接新建一个server.js 然后 输入以下代码 var http = require('http') http.createServer(function(req,res){ res.writeH ...