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. 在Android上编译OSG[3.0.2 ] (转)

    在Android上编译OSG[3.0.2 ] 分类:Android   This file contents can be applied for version OpenSceneGraph(OSG ...

  2. hdu3591The trouble of Xiaoqian 多重背包+全然背包

    //给出Xiaoqian的钱币的价值和其身上有的每种钱的个数 //商家的每种钱的个数是无穷,xiaoqian一次最多付20000 //问如何付钱交易中钱币的个数最少 //Xiaoqian是多重背包 / ...

  3. struts2.16中文乱码问题解决

    方法1.在struts.xml文件中添加<constant name="struts.i18n.encoding" value="GBK" /> 方 ...

  4. 关于js对象的基础使用方法-《javascript设计模式》读书笔记

    一.利用对象收编变量 当我们决定实现某一项功能的时候最简单的其实就是写一个命名函数,然后调用来实现,就像这样: function checkName(){ //验证姓名 } function chec ...

  5. [转]MySQL的简单使用和JDBC示例

    MySql简单操作 //启动mysql net start mysql //登陆 mysql -u root -p //创建建数据库 create database mydb; create data ...

  6. Esper epl语句实验

    基础代码见下,下文列举的实验都是在此程序基础上改动. all,snapshot,first String epl = "select * from appTable.win:time(5 s ...

  7. java调试工具jdb

    Finds and fixes bugs in Java platform programs. Synopsis jdb [options] [classname] [arguments] optio ...

  8. C语言 指向结构体数组的指针

    当结构体指针变量指向一个结构体变量数组的时候,此时指针变量的值就是结构体数组的首地址 关于如何定义结构体数组,和将结构体指针指向结构体变量数组,不是重点. 重点是,明白结构体指针的是怎么移动的, 我个 ...

  9. 在IDEA建立Maven的多模块Web项目

    由于要搭建的是Maven项目,考虑到后面可能会有扩展,因此项目搭建的分模块的. 下面一步一步的来搭建这个项目 打开IDEA集成开发环境,点击File ---> New ---> Proje ...

  10. WinForm程序打包工具InnoSetup使用说明图文教程

    WinForm程序打包工具InnoSetup使用说明图文教程 WinForm程序开发测试好了,如果将Debug/Release里面的文件发给客户使用,会让客户觉得你不够专业,但是使用VS自带的打包工具 ...