题目链接: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. linux Completions 机制

    内核编程的一个普通模式包括在当前线程之外初始化某个动作, 接着等待这个动作结束. 这个动作可能是创建一个新内核线程或者用户空间进程, 对一个存在着的进程的请求, 或 者一些基于硬件的动作. 在这些情况 ...

  2. PowerShell 通过 WMI 获取系统安装的驱动

    本文告诉大家如何通过 WMI 获取用户已经安装的驱动程序 通过下面代码可以获取用户已经安装的驱动程序 Get-WmiObject Win32_SystemDriver | Format-List Ca ...

  3. Linux 内核总线属性

    几乎 Linux 驱动模型中的每一层都提供一个添加属性的接口, 并且总线层不例外. bus_attribute 类型定义在 <linux/device.h> 如下: struct bus_ ...

  4. 【u033】地震逃生

    Time Limit: 1 second Memory Limit: 64 MB [问题描述] 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一 ...

  5. ORACLE禁用和启用外键

    禁用外键 select 'alter table '|| t.table_name||' disable constraint '||t.constraint_name||';' from user_ ...

  6. SQLAlchemy的增删改查 一对多 多对多

    Models只是配置和使用比较简单,因为是Django自带的ORM框架,所以兼容性不行,所以出现了SQLAlchemy,SQLAlchemy是比较全面的ORM框架,它可以在任何使用SQL查询时使用 以 ...

  7. TestStand 界面重置【小技巧】

    有几种情况可能会使用到这个功能: (1)当界面调整的很乱的时候 (2)当界面突然消失的时候(但是软件进程还在)--快捷键 Alt+V 会弹出菜单,再点击Reset UI Configuration即可 ...

  8. TCP/IP||ICMP

    1.概述 ICMP为IP组成部分之一,传递差错报文并返回用户进程,在IP数据报内部被传输 类型字段可以有15个不同的值,以描述特定类型的ICMP报文,检验和字段覆盖整个ICMP报文. 2.报文类型 在 ...

  9. DEVOPS技术实践_23:判断文件下载成功作为执行条件

    在实际生产中,我们经常会需要通过判断一个结果作为一个条件去执行另一个内容,比如判断一个文件是否存在,判官一个命令是否执行成功等等 现在我们选择其中一个场景进行实验,当某个目录下存在,则执行操作 1. ...

  10. python实现上传文件到linux指定目录

    今天接到一个小需求,就是想在windows环境下,上传压缩文件到linux指定的目录位置并且解压出来,然后我想了一下,这个可以用python试试写下. 环境:1.linux操作系统一台2.window ...