P3066 [USACO12DEC]逃跑的BarnRunning Away From (树上二分)
题意
给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个。
树上二分.
这个做法还是基于树上差分的,也就是对于每一个点uu,我们要找到它向上跳LL的长度最高能够跳到的祖先.(当然倍增求出这个连dfsdfs都不用更加粗暴.)
因此我们不仅要记录每一个节点到根节点的距离disdis,还要记录每一个节点到根节点要经过边的边数,也即点的深度depdep.
然后再用tmptmp数组记录从根节点到uu经过的每一个点,tmp[i]tmp[i]表示从根节点到uu的路径上深度为ii的节点的编号,
只要用tmp[dep[u]]=u一句话就可以记录了.
记录了路径上的点,接下来神奇的事情发生了.
可以发现,路径上的点到根的距离是单调递增的,我们在tmptmp数组里二分可以找到离uu距离不超过LL的最高祖先. 这样对每个点都差分,最后dfsdfs处理一遍就可以了.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int yuzu=2e5;
typedef int fuko[yuzu|];
typedef ll rize[yuzu|];
struct edge{int to; ll c;};
vector<edge> lj[yuzu|];
fuko fa,ans,dep,tmp,cha;
rize dis; void dfs(int u,ll len) {
dep[u]=dep[fa[u]]+; // 求节点u的深度
tmp[dep[u]]=u; // 记录从根节点到u深度为dep[u]的点.
int l=,r=dep[u],mid;
for (;l<r;dis[u]-dis[tmp[mid]]<=len?r=mid:l=mid+) mid=l+r>>;
/*在这条路径上二分能跳到的最高祖先*/
cha[fa[tmp[l]]]--,cha[u]++; // 差分
for (edge i:lj[u])
dis[i.to]=dis[u]+i.c,dfs(i.to,len);
} int main() {
int i,n; ll l,x;
scanf("%d%lld",&n,&l);
for (i=;i<=n;++i)
scanf("%d%lld",&fa[i],&x),
lj[fa[i]].push_back(edge{i,x});
dfs(,l);
for (i=n;i;--i) cha[fa[i]]+=cha[i];
/*由于每个点的父节点已知并且肯定比原节点编号小,可以倒过来用一个循环代替dfs*/
for (i=;i<=n;++i) printf("%d\n",cha[i]);
}
P3066 [USACO12DEC]逃跑的BarnRunning Away From (树上二分)的更多相关文章
- P3066 [USACO12DEC]逃跑的BarnRunning Away From… 树上差分_树上倍增
code: #include <cstdio> using namespace std; #define ll long long const int N=200005; int n,fa ...
- 洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…
题面链接 一句话题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 我:似乎并不好做啊...看了题解后大雾... sol:考虑树上差分,对于一个点,在他那个位置++, ...
- P3066 [USACO12DEC]逃跑的BarnRunning Away From
目录 题目 思路 错误&&注意 代码 题目 luoguP3066 思路 虽说这个题目有多种做法,但 左偏树算法: 我们发现这个合并的时候并不好合并,因为存的值不是固定的 那我们是不是可 ...
- [USACO12DEC] 逃跑的BarnRunning Away From…(主席树)
[USACO12DEC]逃跑的BarnRunning Away From- 题目描述 It's milking time at Farmer John's farm, but the cows hav ...
- luoguP3066 [USACO12DEC]逃跑的BarnRunning
luoguP3066 [USACO12DEC]逃跑的BarnRunning 题目大意 给定一棵n个节点的树和参数L,查询每个节点子树中到达该节点距离<=L的数量(包括该节点) 偏模板的主席树 P ...
- 洛谷P3066 [USACO12DEC] 逃跑的Barn [左偏树]
题目传送门 逃跑的Barn 题目描述 It's milking time at Farmer John's farm, but the cows have all run away! Farmer J ...
- P3066 [USACO12DEC] 逃跑的Barn 左偏树
P3066 逃跑的Barn 左偏树 题面 题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 注意到答案的两个性质: 一个点的所有答案一定包含在其所有儿子的答案中 如 ...
- 洛谷P3066 [USACO12DEC]逃跑的Barn (线段树合并)
题目描述It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to ro ...
- [Luogu3066][USACO12DEC]逃跑的BarnRunning Away From…
题面 题目描述 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 输入格式: Line 1: 2 integers, N and L (1 <= N <= 2 ...
随机推荐
- Lambda02 函数式接口
1 java8默认提供的函数式接口 1.1 Predicate /* * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rig ...
- 使用图形界面管理工具Navicat for MySQL连接Mysql数据库时提示错误:Can't connect to MySQL server (10060)
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...
- 20-取石子动态规则(hdu2516 斐波那契博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=2516 取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- Ubuntu下libpcap安装步骤
第一步,先安装GCC ,一般都会自动安装 sudo apt-get install build-essential 第二步,GNU M4可以从此处ftp.gnu.org/gnu/m4/ 下载 sudo ...
- Hyperledger Fabric Chaincode解析
首先看下Blockchain结构,除了header指向下一个block的hash value外,block是由一组transaction构成, Transactions --> Blocks - ...
- pipeline 对部分特征进行处理
http://scikit-learn.org/stable/auto_examples/preprocessing/plot_function_transformer.html#sphx-glr-a ...
- hdu 4278 Faulty Odometer(进制转换)
十进制转八进制的变形: #include<stdio.h> int main() { int n; while(scanf("%d",&n)!=EOF& ...
- hdu 4741 Save Labman No.004 (异面直线的距离)
转载学习: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorit ...
- 在Global.asax文件的Application_BeginRequest中获取request请求内容
protected void Application_BeginRequest(object sender, EventArgs e) { try { string isLogRequest = Sy ...
- Eclipse工具
1 ArrayList的常见方法 * a: add(参数) 向集合中添加元素 * b: get(int index) 取出集合中的元素,get方法的参数,写入索引 * c: size() 返回集合的长 ...