可并堆

复习一下可并堆

维护一个大跟堆,每次把节点儿子打上边权标记,然后合并,可并堆上维护一个size,每次把大于l的弹出,size就是答案

程序中那个d写l和r速度差不多,我写l是表示右儿子到u的最长距离

#include<bits/stdc++.h>
using namespace std;
const int N = ;
struct edge {
int to;
long long w;
edge(int to = , long long w = ) : to(to), w(w) {}
};
int n;
long long L;
long long dis[N], tag[N];
int root[N], l[N], r[N], d[N], ans[N], size[N];
vector<edge> G[N];
void pushdown(int x)
{
if(tag[x] == ) return;
tag[l[x]] += tag[x];
dis[l[x]] += tag[x];
tag[r[x]] += tag[x];
dis[r[x]] += tag[x];
tag[x] = ;
}
int merge(int u, int v)
{
if(!u) return v;
if(!v) return u;
pushdown(u);
pushdown(v);
if(dis[u] < dis[v]) swap(u, v);
r[u] = merge(r[u], v);
if(d[r[u]] > d[l[u]]) swap(l[u], r[u]);
d[u] = d[l[u]] + ;
size[u] = size[l[u]] + size[r[u]] + ;
return u;
}
void dfs(int u)
{
root[u] = u;
size[u] = ;
for(int i = ; i < G[u].size(); ++i)
{
edge e = G[u][i];
dfs(e.to);
tag[root[e.to]] += e.w;
dis[root[e.to]] += e.w;
root[u] = merge(root[u], root[e.to]);
}
while(dis[root[u]] > L && root[u]) root[u] = merge(l[root[u]], r[root[u]]);
ans[u] = size[root[u]];
}
int main()
{
scanf("%d%lld", &n, &L);
for(int i = ; i <= n; ++i)
{
int u;
long long len;
scanf("%d%lld", &u, &len);
G[u].push_back(edge(i, len));
}
dfs();
for(int i = ; i <= n; ++i) printf("%d\n", ans[i]);
return ;
}

bzoj3011的更多相关文章

  1. 【BZOJ3011】[Usaco2012 Dec]Running Away From the Barn 可并堆

    [BZOJ3011][Usaco2012 Dec]Running Away From the Barn Description It's milking time at Farmer John's f ...

  2. [BZOJ3011][Usaco2012 Dec]Running Away From the Barn

    题意 给出一棵以1为根节点树,求每个节点的子树中到该节点距离<=l的节点的个数 题解 方法1:倍增+差分数组 首先可以很容易的转化问题,考虑每个节点对哪些节点有贡献 即每次对于一个节点,找到其第 ...

  3. bzoj3011 可并堆

    我们可以遍历得出每个节点到根节点的距离h,然后用可并堆进行维护.树形dp 我用的是pairing heap #include<cstdio> #include<algorithm&g ...

  4. bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3011 题解 复习一下左偏树板子. 看完题目就知道是左偏树了. 结果这个板子还调了好久. 大概已 ...

  5. Usaco2012-2013 金组 题解 (暂缺Hill walk以及Figue eight)

    https://files.cnblogs.com/files/Winniechen/usaco2012-2013.pdf 做的不是很好,还请见谅! 如果有什么疑问,可以QQ上找我. QQ号:1967 ...

随机推荐

  1. Spring Boot 创建hello world项目

    Spring Boot 创建hello world项目 1.创建项目 最近在学习Spring Boot,这里记录使用IDEA创建Spring Boot的的过程 在1出勾选,选择2,点击Next 这里填 ...

  2. Java真实笔试题一

    PS:昨天去笔试后,发现自己对于JavaSE的基础部分还是有些薄弱的地方,特将昨天自己不是太清楚的地方记录下来,巩固基础. 子类继承父类静态方法的问题 public class Study { pub ...

  3. Address already in use: JVM_Bind:8080错误的解决办法

    解决办法:先到命令行查找8080端口号被那个占用,输入后面的命令:netstat -ano 查到 然后到任务管理器把PID为20904的进程给结束掉,就OK了 -------------------- ...

  4. 微信小程序 setData动态修改数据数组的值

    1.问题说明 有一组数据,用来存储图片路径,动态修改图片的路径来上传图片,而小程序JS只能通过事件获取时机和setData方法修改数据来改变view. 而用这样写的方式明显是错误的 2.解决办法 字符 ...

  5. Nginx+Tomcat简单负载均衡

    Nginx,Apache安装完成 复制Tomcat:    tomcat-8080    tomcat-8081 启动Tomcat8080: cd /usr/local/tomcat-8080/bin ...

  6. Linux查看用户列表

    cat /etc/passwd 可以查看所有用户的列表w 可以查看当前活跃的用户列表cat /etc/group 查看用户组 groups 查看当前登录用户的组内成员groups gliethttp ...

  7. OpenCV+Python识别车牌和字符分割的实现

    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...

  8. Codeforces 938C - Constructing Tests

    传送门:http://codeforces.com/contest/938/problem/C 给定两个正整数n,m(m≤n),对于一个n阶0-1方阵,其任意m阶子方阵中至少有一个元素“0”,则可以求 ...

  9. BNUOJ 2461 Anniversary party

    Anniversary party Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Origi ...

  10. 控制公司(codevs 2051)

    题目描述 Description 有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分.例如,福特公司拥有马自达公司12%的股票.据说,如果至少满足了以下三个条件之一,公司A就可以 ...