luoguP3066 [USACO12DEC]逃跑的BarnRunning
luoguP3066 [USACO12DEC]逃跑的BarnRunning
题目大意
给定一棵n个节点的树和参数L,查询每个节点子树中到达该节点距离<=L的数量(包括该节点)
偏模板的主席树
PS:注意一下输入格式
dfs:得出每个子树时间戳区间,每个节点到根节点的距离,仔细理解一下几个数组的含义吧,dalao直接略过
update:这题以时间戳(i)为关键字继承(i-1)
query:直接查询每个子树的时间戳区间里<=dep[i]+L
这里用到了一个小技巧,就是为了避免特判,b数组加一个虚节点inf,查询<now的就好了
My complete code:
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL maxn=3e5;
const LL inf=1e18;
inline LL read(){
LL x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0'; c=getchar();
}return x*f;
}
struct node{
LL to,next,d;
}dis[maxn];
LL n,L,num,nod,num1,cnt;
LL head[maxn],dep[maxn],b[maxn],low[maxn],dfn[maxn],sot[maxn],date[maxn<<7],lt[maxn<<7],rt[maxn<<7],root[maxn];
inline void add(LL u,LL v,LL d){
dis[++num]=(node){v,head[u],d}; head[u]=num;
}
void dfs(LL u,LL fa){
sot[++num1]=u;
b[++cnt]=dep[u];
dfn[u]=++num;
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
dep[v]=dep[u]+dis[i].d;
dfs(v,u);
}
low[u]=num;
}
void update(LL &now,LL pre,LL l,LL r,LL c){
now=++nod;
date[now]=date[pre]+1;
if(l==r)
return;
LL mid=(l+r)>>1;
if(c<=mid){
update(lt[now],lt[pre],l,mid,c);
rt[now]=rt[pre];
}else{
update(rt[now],rt[pre],mid+1,r,c);
lt[now]=lt[pre];
}
}
LL query(LL pre,LL next,LL l,LL r,LL c){//<c
LL mid=(l+r)>>1;
if(r<c)
return date[next]-date[pre];
LL ans=0;
if(l<c)
ans+=query(lt[pre],lt[next],l,mid,c);
if(mid+1<c)
ans+=query(rt[pre],rt[next],mid+1,r,c);
return ans;
}
int main(){
scanf("%lld%lld",&n,&L);
for(LL v=2;v<=n;++v){
LL u=read(),e=read();
add(u,v,e);
}
num=0;
dfs(1,0);
sort(b+1,b+1+cnt);
b[++cnt]=inf;
cnt=unique(b+1,b+1+cnt)-b-1;
for(LL i=1;i<=n;++i){
LL u=sot[i];
LL now=lower_bound(b+1,b+1+cnt,dep[u])-b;
update(root[i],root[i-1],1,cnt,now);
}
for(LL i=1;i<=n;++i){
LL l=dfn[i],r=low[i];
LL now=upper_bound(b+1,b+1+cnt,dep[i]+L)-b;
printf("%lld\n",query(root[l-1],root[r],1,cnt,now));
}
return 0;
}/*
4 5
1 4
2 3
1 5 3
2
1
1
*/
luoguP3066 [USACO12DEC]逃跑的BarnRunning的更多相关文章
- [USACO12DEC] 逃跑的BarnRunning Away From…(主席树)
[USACO12DEC]逃跑的BarnRunning Away From- 题目描述 It's milking time at Farmer John's farm, but the cows hav ...
- P3066 [USACO12DEC]逃跑的BarnRunning Away From
目录 题目 思路 错误&&注意 代码 题目 luoguP3066 思路 虽说这个题目有多种做法,但 左偏树算法: 我们发现这个合并的时候并不好合并,因为存的值不是固定的 那我们是不是可 ...
- [Luogu3066][USACO12DEC]逃跑的BarnRunning Away From…
题面 题目描述 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 输入格式: Line 1: 2 integers, N and L (1 <= N <= 2 ...
- 洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…
题面链接 一句话题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 我:似乎并不好做啊...看了题解后大雾... sol:考虑树上差分,对于一个点,在他那个位置++, ...
- [USACO12DEC]逃跑的BarnRunning Away From…
题意 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个 题解 似乎有好多种做法啊……然而蒟蒻只会打打主席树的板子…… 调了一个上午一直WA……狠下心来重打一遍居然直接一遍过 ...
- Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
好像是某CF的题,不记得…… 很套路的题,但是觉得可以做一下笔记. 倍增 + 差分. 有一个比较简单的思路就是每一个点$x$向上走一走,直到走到一个点$y$使总路程恰好不超过超过了$L$,然后把$(x ...
- P3066 [USACO12DEC]逃跑的BarnRunning Away From (树上二分)
题意 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 树上二分.这个做法还是基于树上差分的,也就是对于每一个点uu,我们要找到它向上跳LL的长度最高能够跳到的祖先.(当 ...
- P3066 [USACO12DEC]逃跑的BarnRunning Away From… 树上差分_树上倍增
code: #include <cstdio> using namespace std; #define ll long long const int N=200005; int n,fa ...
- LuoguP3066 逃跑的BarnRunning Away From…
LuoguP3066 先吐槽一下,这道题名字好长啊 一个非常明显的思路,利用倍增数组不断向上跳.直到数值大于\(L\),然后直接差分统计答案就好了. 这种ZROI也考过,不多赘述了. 我们来考虑主席树 ...
随机推荐
- ubuntu git 下添加 ssh
1 ssh-keygen 产生公钥和私钥 2 cat ~/.ssh/id_rsa.pub 复制出对应的公钥, 3 拷贝到git上的ssh-key里,注意拷贝时,换行处可能会引起错误,要把换行处的空格 ...
- Android 使用内置的Camera应用程序捕获图像
本Demo的实现效果是调用手机上已安装的照相机来实现拍照的功能,拍好的照片以ImageView形式展示. 目的:学习手机调用安装的相机照相,对大的图片处理有所认识,这里主要用到BitmapFactor ...
- 2017.2.28 activiti实战--第六章--任务表单(一)动态表单
学习资料:<Activiti实战> 第六章 任务表单(一)动态表单 内容概览:本章要完成一个OA(协同办公系统)的请假流程的设计,从实用的角度,讲解如何将activiti与业务紧密相连. ...
- maven 配置jetty插件
<build> <finalName>shiroweb</finalName> <plugins> & ...
- Solidworks如何制作动画1
1点击窗口下方的"运动算例1"可以弹出动画的面板,右击该"运动算例1"还可以对这个动画窗口重命名等操作. 2 我们从最简单的动画开始,假设图示装配体,想要把它从 ...
- C/C++中作用域详解(转)
作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在哪儿销毁(也就是说超出了作用域).变量的有效作用域从它的定义点开始,到和定义变量之前最邻近的开括号配对的第一个闭括号.也就是说,作用域由变量所在的 ...
- Javascript模式(三) 策略模式
var data = { "username" : "zhangsan", "password" : "12345690" ...
- swift菜鸟入门视频教程-05-控制流
本人自己录制的swift菜鸟入门.欢迎大家拍砖.有什么问题能够在这里留言. 主要内容: For 循环 While 循环 条件语句 控制转移语句(Control Transfer Statements) ...
- iOS 从UITableViewController中分离数据源
之前看objc.io #1 Light View Controllers看到一个非常不错的技巧:从UITableViewController中分离数据源,这样能够减小UITableViewContro ...
- HDFS源码分析心跳汇报之数据结构初始化
在<HDFS源码分析心跳汇报之整体结构>一文中,我们详细了解了HDFS中关于心跳的整体结构,知道了BlockPoolManager.BPOfferService和BPServiceActo ...