2019 牛客国庆集训day1 2019 点分治
题目链接: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 点分治的更多相关文章
- 2019牛客国庆集训派对day5
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...
- 2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)
链接:https://ac.nowcoder.com/acm/contest/1099/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 计算几何板子题【2019牛客国庆集训派对day7——三角形和矩形】【多边形相交的面积】
链接:https://ac.nowcoder.com/acm/contest/1112/J来源:牛客网 题目描述 Bobo 有一个三角形和一个矩形,他想求他们交的面积. 具体地,三角形和矩形由 8 个 ...
- 2019牛客国庆集训派对day7 A 2016
链接:https://ac.nowcoder.com/acm/problem/52800来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...
- 2019牛客国庆集训派对day1(A, B E F K)
链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...
- 2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转
题目链接: 解法: 先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记. #include <bits/stdc++.h> usi ...
- 2019牛客国庆集训派对day1
C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...
- 2019牛客国庆集训派对day3 买一送一
题目链接: 题意:有n个点,n-1条单向边,每个点都销售一类商品 问从点1开始走,买第一样商品类型为x,买第二样商品类型为y,问不同有序对<x,y>的数量 解法: col[i]表示这个点的 ...
- 2019牛客国庆集训派对day3
E. Grid 大意: 给定$n\cdot m$个点的图, 初始无边, $q$个操作, $(1,a,b)$表示第$a$列到第$b$列全连起来, $(2,a,b)$表示把第$a$行到第$b$行全连起来, ...
随机推荐
- P1070 东风谷早苗
题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重).早苗的 ...
- H3C 路由优先级
- P1012 鸡兔同笼问题
题目描述 笼子里有鸡和兔若干,一直它们共有头 \(n\) 个,有脚 \(m\) 只,问笼中的鸡和兔共有多少只? 输入格式 输入包含两个整数 \(n,m(1 \le n \le 100, 2n \le ...
- Vue 扩展插件
- Linux USB 和 sysfs
由于单个 USB 物理设备的复杂性, 设备在 sysfs 中的表示也非常复杂. 物理 USB 设备 (通过 struct usb_device 表示)和单个 USB 接口(由 struct usb_i ...
- 雪花算法 Snowflake & Sonyflake
唯一ID算法Snowflake相信大家都不墨生,他是Twitter公司提出来的算法.非常广泛的应用在各种业务系统里.也因为Snowflake的灵活性和缺点,对他的改造层出不穷,比百度的UidGener ...
- 使用element的upload组件实现一个完整的文件上传功能(下)
本篇文章是<使用element的upload组件实现一个完整的文件上传功能(上)>的续篇. 话不多说,接着上一篇直接开始 一.功能完善—保存表格中每一列的文件列表状态 1.思路 保存表格中 ...
- python获取网页信息的三种方法
import urllib.request import http.cookiejar url = 'http://www.baidu.com/' # 方法一 print('方法一') req_one ...
- 1059 C语言竞赛 (20 分)C语言
C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛.既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽: 0.冠军将赢得一份"神秘大奖"(比如很巨大的一本学生研究论文集--). 1 ...
- 钱包开发经验分享:ETH篇
# 钱包开发经验分享:ETH篇 [TOC] ## 开发前的准备 > 工欲善其事,必先利其器 一路开发过来,积累了一些钱包的开发利器和网站,与大家分享一下.这些东西在这行开发过的人都知道,只是给行 ...