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 ...
随机推荐
- linq 条件查询与分页
<div>姓名:<asp:TextBox ID="T1" runat="server"></asp:TextBox>< ...
- spring aop自动代理注解配置之一
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Mock Server实践
转载自 https://tech.meituan.com/mock-server-in-action.html 背景 在美团服务端测试中,被测服务通常依赖于一系列的外部模块,被测服务与外部模块间通过R ...
- FacadePattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...
- ls -al
ls -al:显示当前文件下所有的文件
- 浅谈android代码保护技术_加固
可看原文: http://www.cnblogs.com/jiaoxiake/p/6536824.html 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结 ...
- ThreadStart方式实现多线程
以ThreadStart方式实现多线程 3.1 使用ThreadStart委托 这 里先以一个例子体现一下多线程带来的好处,首先在Message类中建立一个方法ShowMessage(),里面显示了当 ...
- 利用Thread.stop完成方法执行超时中断
示例代码可以从github上获取 https://github.com/git-simm/simm-framework.git 接上篇博客<FutureTask子线程取消执行的状态判断> ...
- 基于任务的异步编程模式,Task-based Asynchronous Pattern
术语: APM 异步编程模型,Asynchronous Programming Model,其中异步操作由一对 Begin/End 方法(如 FileStream.BeginRea ...
- LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...