淀粉质模板 Tree
Tree
题目描述
给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K
输入输出格式
输入格式:
N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k
输出格式:
一行,有多少对点之间的距离小于等于k
淀粉质感觉怎么写都不好看啊,迷。。
实现方法非常多。
大概思路:
对每一个子树的二层子节点进行遍历,处理每个点所属的二层子节点和到根节点的距离
以到根节点的距离为关键字排序,从两边进行扫描
如果当前满足,答案就加上\(r-l-\)和\(l\)属于同一颗二层子节点的数的数量,后者可以直接拿一个桶边扫描边维护
这个每次可以统计答案的区间是逐渐缩小的,有单调性。每次统计时候的意义是对\(l\)位置的节点,有多个点可以跨过根和它配对。
然后递归处理子树的答案。注意每次选择重心作为根节点保证复杂度。
Code:
#include <cstdio>
#include <algorithm>
const int N=4e4+10;
const int inf=0x3f3f3f3f;
int head[N],to[N<<1],Next[N<<1],edge[N<<1],cnt;
void add(int u,int v,int w)
{
to[++cnt]=v,Next[cnt]=head[u],edge[cnt]=w,head[u]=cnt;
}
struct node
{
int b,d;
node(){}
node(int b,int d){this->b=b,this->d=d;}
bool friend operator <(node n1,node n2){return n1.d<n2.d;}
}a[N];
int mi,id,ans,n,m,k,coun[N],siz[N],del[N];
int max(int x,int y){return x>y?x:y;}
void get_g(int now,int fa,int su)
{
siz[now]=1;int mx=0;
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(!del[v]&&v!=fa)
{
get_g(v,now,su);
mx=max(mx,siz[v]);
siz[now]+=siz[v];
}
}
mx=max(mx,su-siz[now]);
if(mx<mi) mi=mx,id=now;
}
void dfs(int now,int fa,int anc,int dis)
{
a[++cnt]=node(anc,dis);
siz[now]=1;
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(!del[v]&&v!=fa)
dfs(v,now,anc,dis+edge[i]),siz[now]+=siz[v];
}
}
void divide(int now,int su)
{
mi=inf,cnt=0;
get_g(now,0,su);
now=id;del[now]=1;
a[++cnt]=node(now,0),coun[now]=1;
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(!del[v])
dfs(v,now,v,edge[i]),coun[v]=siz[v];
}
std::sort(a+1,a+1+cnt);
int l=1,r=cnt;
while(l<r)
{
while(l<r&&a[r].d+a[l].d>k) --coun[a[r--].b];
if(a[r].d+a[l].d<=k) ans+=r-l-coun[a[l].b]+1;
--coun[a[l++].b];
}
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(!del[v])
divide(v,siz[v]);
}
}
int main()
{
scanf("%d",&n);
for(int u,v,w,i=1;i<n;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
scanf("%d",&k);
divide(1,n);
printf("%d\n",ans);
return 0;
}
2018.9.15
淀粉质模板 Tree的更多相关文章
- loj2497 [PA2017]Banany(动态淀粉质)
link 给定一棵树,点有点权,边有边权,你每次修改一个点点权或者是修改一个边边权 你一开始在1号点,你每次改节点之后你需要移动到另一个节点,满足这个节点权值减去路径长度最大(下一次从这个节点移动)如 ...
- 【JZOJ6368】质树(tree)
description 大神 wyp 手里有棵二叉树,每个点有一个点权.大神 wyp 的这棵树是质树,因为 随便找两个不同的点 u, v,只要 u 是 v 的祖先,都满足 u 和 v 的点权互质. 现 ...
- 动态淀粉质(划掉)题单&简要题解
简介 动态点分治的思想:还不太清楚诶怎么办. 大概是通过降低树高来降低每次修改和询问的复杂度吧,还可以把树上一个连通块的信息统计到一个点(重心)上.具体实现方式和普通的静态点分治没有太大的区别,只是把 ...
- [POJ1741]Tree(点分治模板)
传送门 良心解析 其实以前在求某段序列上的区间统计问题时就碰到过类似于这样的思想. 当时的区间统计问题思路大致是这样: 选取一个点作为中间点,从这个点的左边和右边统计出满足条件的点对.然后当前的中间点 ...
- 【题解】Digit Tree
[题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...
- 【模板】P3806点分治1
[模板]P3806 [模板]点分治1 很好的一道模板题,很无脑经典. 讲讲淀粉质吧,很营养,实际上,点分治是树上的分治算法.根据树的特性,树上两点的路径只有一下两种情况: 路径经过根\((*)\) 路 ...
- Hello Kiki(中国剩余定理——不互质的情况)
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- P3806 【模板】点分治1
一道淀粉质的模版题,开始是暴力 #include <bits/stdc++.h> #define up(i,l,r) for(register int i = (l); i <= ( ...
- P4178 Tree
最简单的点分治 淀粉质的思想: “分而治之”,缩小问题规模,合并求解: #include<cstdio> #include<cmath> #include<cstring ...
随机推荐
- lintcode_69_二叉树的层次遍历
二叉树的层次遍历 描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? LinkedIn Airb ...
- 协程实现tcp两个客户端的通讯
import socket import gevent from gevent import monkey monkey.patch_all() def cb_work(recv_num,send_n ...
- 前端vue项目部署到tomcat,一刷新报错404解决方法
公司前端写的后台部署到tomcat webapps目录下后,无法进行刷新,一刷新就会报错404,自动跳的404页面.在网上查了下,官方说是HTML5 History 模式引发的问题,但是解决方案中,并 ...
- 交换机基础配置之单交换机划分vlan
我们以以上拓扑图为例 pc0的IP地址为:192.168.1.1 pc1的ip地址为:192.168.1.2 两台主机在同一网段,相互ping是能ping通的 我们的目的是在单交换机上划分两个vlan ...
- LeetCode207 课程表
问题:课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定 ...
- linux上面安装svn步骤
一.安装 使用yum,非常简单 yum install subversion 二.配置 2.1.创建仓库 我们这里在/home下建立一个名为svn的仓库(repository),以后所有代码都放在这个 ...
- MySQL常用命令基础操作
MySQL启动与更改密码 mysql启动基本原理说明: /etc/init.d/mysqld是一个shell启动脚本,启动后最终会调用,mysqld_safe脚本,最后调用mysqld服务启动mysq ...
- 方法的重写(Override)与重载(Overload)的含义与区别
1.Override(重写) 两同,两小,一大 两同:方法名相同,参数列表相同 两小:抛出的异常要小于等于父类,返回值类型要小于等于父类 一大:访问权限要大于等于父类 2.Overload(重载) 方 ...
- TouTiao开源项目 分析笔记18 视频详情页面
1.效果预览 1.1.需要做到的真实效果 1.2.触发的点击事件 在MediaArticleVideoViewBinder的每一个item点击事件中: VideoContentActivity.lau ...
- JAVA中使用AES加密解密
技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info(&qu ...