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的更多相关文章

  1. [USACO12DEC] 逃跑的BarnRunning Away From…(主席树)

    [USACO12DEC]逃跑的BarnRunning Away From- 题目描述 It's milking time at Farmer John's farm, but the cows hav ...

  2. P3066 [USACO12DEC]逃跑的BarnRunning Away From

    目录 题目 思路 错误&&注意 代码 题目 luoguP3066 思路 虽说这个题目有多种做法,但 左偏树算法: 我们发现这个合并的时候并不好合并,因为存的值不是固定的 那我们是不是可 ...

  3. [Luogu3066][USACO12DEC]逃跑的BarnRunning Away From…

    题面 题目描述 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 输入格式: Line 1: 2 integers, N and L (1 <= N <= 2 ...

  4. 洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…

    题面链接 一句话题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 我:似乎并不好做啊...看了题解后大雾... sol:考虑树上差分,对于一个点,在他那个位置++, ...

  5. [USACO12DEC]逃跑的BarnRunning Away From…

    题意 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个 题解 似乎有好多种做法啊……然而蒟蒻只会打打主席树的板子…… 调了一个上午一直WA……狠下心来重打一遍居然直接一遍过 ...

  6. Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…

    好像是某CF的题,不记得…… 很套路的题,但是觉得可以做一下笔记. 倍增 + 差分. 有一个比较简单的思路就是每一个点$x$向上走一走,直到走到一个点$y$使总路程恰好不超过超过了$L$,然后把$(x ...

  7. P3066 [USACO12DEC]逃跑的BarnRunning Away From (树上二分)

    题意 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 树上二分.这个做法还是基于树上差分的,也就是对于每一个点uu,我们要找到它向上跳LL的长度最高能够跳到的祖先.(当 ...

  8. P3066 [USACO12DEC]逃跑的BarnRunning Away From… 树上差分_树上倍增

    code: #include <cstdio> using namespace std; #define ll long long const int N=200005; int n,fa ...

  9. LuoguP3066 逃跑的BarnRunning Away From…

    LuoguP3066 先吐槽一下,这道题名字好长啊 一个非常明显的思路,利用倍增数组不断向上跳.直到数值大于\(L\),然后直接差分统计答案就好了. 这种ZROI也考过,不多赘述了. 我们来考虑主席树 ...

随机推荐

  1. 【音乐App】—— Vue-music 项目学习笔记:项目准备

    前言: 学习慕课网Vue高级实战课程后,在实践中总结一些这个项目带给自己的收获,希望可以再次巩固关于Vue开发的知识.这一篇主要梳理:项目概况.项目准备.页面骨架搭建.项目github地址:https ...

  2. JAVA Eclipse 出现 load id=gralloc != hmi-id=gralloc怎么办

    一般是应用程序权限导致的,在Manifest.xml文件中,targetSdkVersion设置不正确,你可以直接删掉这个信息                              

  3. mongodb模拟生产环境的分片集群

       分片是指数据拆分 将其分散在不同的机器上的过程,有时候也叫分区来表示这个概念.将数据分散到不同机器上 不需要功能强大的计算机就可以储存更多的数据,处理更大的负载.        几乎所有的数据库 ...

  4. java编译命令工具javac

    Reads Java class and interface definitions and compiles them into bytecode and class files. Synopsis ...

  5. 【Excle数据透视表】如何重命名数据透视表

    如下图,是新生成的一个数据透视简表,现在需要将其数据透视表的名称修改为:汇总数据 解决办法 修改后的效果如下:

  6. 使用Nginx的proxy_cache缓存功能取代Squid

    Nginx从0.7.48版本开始,支持了类似Squid的缓存功能.这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302 ...

  7. 安装WordPress

    安装php yum install php-fpm yum install php systemctl start php-fpm 启动php nginx 配置

  8. cocos2d-x-3.1 国际化strings.xml解决乱码问题 (coco2d-x 学习笔记四)

    今天写程序的时候发现输出文字乱码,尽管在实际开发中把字符串写在代码里是不好的做法.可是有时候也是为了方便,遇到此问题第一时间在脑子里面联想到android下的strings.xml来做国际化.本文就仅 ...

  9. anaconda2下面安装opencv2.4.13.4完成----解决默认安装的问题----Thefunction is not implemented. Rebuild the library with Windows, GTK+ 2.x orCarbon support. If you are on Ubuntu or Debian, install libgtk2.0‑dev and pkg

    转载自:http://blog.csdn.net/qingyanyichen/article/details/73550924 本人下载编译安装了opencv2.4.9,oppencv2.4.10,o ...

  10. Chrome自带恐龙小游戏的源码研究(七)

    在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较 ...