题目链接:https://ac.nowcoder.com/acm/contest/1099/I

点分治,计算路径数的时候,先将每个点到根的距离模2019,计算的时候就可以O(n)求出数目,对于模2019之后为0的进行特殊处理。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 100005
#define inf 0x3f3f3f3f
int n,k,cnt,root,ans,maxx,head[maxn],size[maxn],son[maxn],vis[maxn],num[maxn];
struct edge{
int to,next,val;
}e[maxn];
vector<int>dis;
void add(int u,int v,int val)
{
e[++cnt].to=v;
e[cnt].next=head[u];
e[cnt].val=val;
head[u]=cnt;
}
void dfs_size(int u,int fa)//求各点子树大小
{
size[u]=;son[u]=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa&&!vis[v])
{
dfs_size(v,u);
size[u]+=size[v];
son[u]=max(son[u],size[v]);
}
}
}
void dfs_root(int N,int u,int fa)//求重心
{
son[u]=max(son[u],N-size[u]);
if(maxx>son[u])
{
root=u;
maxx=son[u];
}
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa&&!vis[v])
dfs_root(N,v,u);
}
}
void dfs_dis(int u,int fa,int val)//求出所有点到根的距离
{
val%=;
num[val]++;
//dis.push_back(val);
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa&&!vis[v])
dfs_dis(v,u,val+e[i].val);
}
}
int cal(int u,int val)//计算小于等于k的路径数
{
for(int i=;i<=;i++)
num[i]=;
//dis.clear();
dfs_dis(u,,val);
//sort(dis.begin(),dis.end());
int l=,r=dis.size()-,ret=;
for(int i=;i<;i++)//two-pointer
{
if(num[i]&&num[-i])ret+=num[i]*num[-i];
}
ret/=;
ret+=num[]*(num[]-)/;
return ret;
}
void dfs(int u)
{
dfs_size(u,);
maxx=inf;
dfs_root(size[u],u,);
ans+=cal(root,);//此时算出的路径数是包括没经过这个根的路径数,后面需要减去这种的路径数
vis[root]=;//将选的roo又被遍历t标记,防止其在之后的分治过程中
for(int i=head[root];i;i=e[i].next)
{
int v=e[i].to,val=e[i].val;
if(!vis[v])
{
ans-=cal(v,val);//子树所有边加上dis(u,v)后满足的路径数就是需要减去的路径数
dfs(v);//递归分治
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int u,v,val;
for(int i=;i<=n;i++)
head[i]=vis[i]=;
cnt=ans=;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&u,&v,&val);
add(u,v,val);
add(v,u,val);
}
dfs();
printf("%d\n",ans);
}
return ;
}

2019 牛客国庆集训day1 2019 点分治的更多相关文章

  1. 2019牛客国庆集训派对day5

    2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...

  2. 2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)

    链接:https://ac.nowcoder.com/acm/contest/1099/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  3. 计算几何板子题【2019牛客国庆集训派对day7——三角形和矩形】【多边形相交的面积】

    链接:https://ac.nowcoder.com/acm/contest/1112/J来源:牛客网 题目描述 Bobo 有一个三角形和一个矩形,他想求他们交的面积. 具体地,三角形和矩形由 8 个 ...

  4. 2019牛客国庆集训派对day7 A 2016

    链接:https://ac.nowcoder.com/acm/problem/52800来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...

  5. 2019牛客国庆集训派对day1(A, B E F K)

    链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...

  6. 2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转

    题目链接: 解法: 先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记. #include <bits/stdc++.h> usi ...

  7. 2019牛客国庆集训派对day1

    C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...

  8. 2019牛客国庆集训派对day3 买一送一

    题目链接: 题意:有n个点,n-1条单向边,每个点都销售一类商品 问从点1开始走,买第一样商品类型为x,买第二样商品类型为y,问不同有序对<x,y>的数量 解法: col[i]表示这个点的 ...

  9. 2019牛客国庆集训派对day3

    E. Grid 大意: 给定$n\cdot m$个点的图, 初始无边, $q$个操作, $(1,a,b)$表示第$a$列到第$b$列全连起来, $(2,a,b)$表示把第$a$行到第$b$行全连起来, ...

随机推荐

  1. Vue 双向数据绑定v-model

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. ubuntu中桌面图标的配置

    在网上随处可以找到怎么样把应用程序的图标放到桌面上,我刚用ubuntu时也是按照网上的做法,一步一步的做的,现将网上的做法复制下来: 桌面配置文件简述\label{sec:desktop file} ...

  3. C# 使用反射获取私有属性的方法

    本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多 在开始之前先添加一个测试的类 public class Foo { private string F { ...

  4. JavaScript DOM查询,原生js实现元素子节点的获取

    在网页网页开发中,经常会需要获取某个网页元素的子元素,然后对其进行事件绑定.或样式修改等行为.这些操作对于jquery来说很容易,但是对于原生js会稍微麻烦一些,这里将介绍四种方法获取元素的子元素(本 ...

  5. linux scull 中的缺陷

    让我们快速看一段 scull 内存管理代码. 在写逻辑的深处, scull 必须决定它请求的内 存是否已经分配. 处理这个任务的代码是: if (!dptr->data[s_pos]) { dp ...

  6. linux 后备缓存

    一个设备驱动常常以反复分配许多相同大小的对象而结束. 如果内核已经维护了一套相同 大小对象的内存池, 为什么不增加一些特殊的内存池给这些高容量的对象? 实际上, 内核 确实实现了一个设施来创建这类内存 ...

  7. H3C保存当前配置--用户图示(console)以上

    <H3C>save         //此种保存只默认保存为Startup.cfg ,系统默认是加载此文件 The current configuration will be writte ...

  8. CSS---cursor 鼠标指针光标样式(形状)

    url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标. default 默认光标(通常是一个箭头) auto 默认.浏览器设置的光标 ...

  9. 2018-2-13-git-合并两个仓库

    title author date CreateTime categories git 合并两个仓库 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...

  10. 【35.53%】【POJ 2912】Rochambeau

    Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2837 Accepted: 1008 Description N childre ...