P3066 [USACO12DEC] 逃跑的Barn 左偏树
P3066 逃跑的Barn 左偏树
题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个。
注意到答案的两个性质:
- 一个点的所有答案一定包含在其所有儿子的答案中
- 如果节点\(i\)当前满足条件,那么所有距离(相对于根节点)比它小的节点当前也都满足(所以建个大根堆)
所以考虑使用左偏树,每个节点都建个大根堆,在\(dfs\)时计算出所有点深度,再利用这些性质回溯时依次合并所有堆,显然答案即为堆的大小。
注意long long
卡了我好久
#include <cstdio>
#include <algorithm>
#define MAXN 200002
#define LL long long
using namespace std;
int n;long long l;
int head[MAXN],nxt[MAXN*2],vv[MAXN*2],tot;
LL ww[MAXN*2];
inline void add_edge(int u, int v, LL w){
ww[++tot]=w;
vv[tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
LL val[MAXN];
int root[MAXN],sz[MAXN],sl[MAXN],sr[MAXN],dis[MAXN];
int merge(int a, int b){
if(a==0||b==0) return a+b;
if(val[a]<val[b]) swap(a,b);
sr[a]=merge(sr[a], b);
if(dis[sl[a]]<dis[sr[a]]) swap(sl[a], sr[a]);
dis[a]=dis[sr[a]]+1;
return a;
}
void dfs(int u, LL wnow){
root[u]=u;
val[u]=wnow;
sz[u]=1;
for(int i=head[u];i;i=nxt[i]){
int v=vv[i];
LL w=ww[i];
dfs(v, wnow+w);
root[u]=merge(root[u], root[v]);
sz[u]+=sz[v];
while(val[root[u]]-val[u]>l){
root[u]=merge(sl[root[u]], sr[root[u]]);
sz[u]--;
}
}
}
int main()
{
scanf("%d %lld", &n, &l);
for(int i=2;i<=n;++i){
int fa;LL w;
scanf("%d %lld", &fa, &w);
add_edge(fa,i,w);
}
dfs(1,0);
for(int i=1;i<=n;++i)
printf("%d\n", sz[i]);
return 0;
}
P3066 [USACO12DEC] 逃跑的Barn 左偏树的更多相关文章
- 洛谷P3066 [USACO12DEC] 逃跑的Barn [左偏树]
题目传送门 逃跑的Barn 题目描述 It's milking time at Farmer John's farm, but the cows have all run away! Farmer J ...
- bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3011 题解 复习一下左偏树板子. 看完题目就知道是左偏树了. 结果这个板子还调了好久. 大概已 ...
- 洛谷P3066 [USACO12DEC]逃跑的Barn (线段树合并)
题目描述It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to ro ...
- USACO Running Away From the Barn /// 可并堆 左偏树维护大顶堆
题目大意: 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于m的点有多少个 左偏树 https://blog.csdn.net/pengwill97/article/details/82 ...
- 数据结构(左偏树,可并堆):BNUOJ 3943 Safe Travel
Safe Travel Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class ...
- BZOJ 1455 罗马游戏 ——左偏树
[题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...
- 【BZOJ-1455】罗马游戏 可并堆 (左偏树)
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1355 Solved: 561[Submit][Status][Discuss] ...
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- zoj 2334 Monkey King/左偏树+并查集
原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1389 大致题意:N只相互不认识的猴子(每只猴子有一个战斗力值) 两只 ...
随机推荐
- on duplicate key mysql插入更新
insert into `test` (`job_id`, `user_name`, `total_time`) values ('12345', 'zhangsan', '10') on dupli ...
- [Done] Codeforces Round #562 (Div. 2) 题解
A - Circle Metro 模拟几百步就可以了. B - Pairs 爆搜一下,时间复杂度大概是 $O(4 * n)$ Code: 56306723 C - Increasing by Modu ...
- IDEA/WebStorm使用笔记
1.使用powershell作为默认终端 #改变powershell策略 Set-ExecutionPolicy Unrestricted -Scope CurrentUser 找到系统的powers ...
- Git config 使用说明(转)
原文:https://blog.csdn.net/gdutxiaoxu/article/details/79253737
- ELK搜索条件
1.要搜索一个确切的字符串,即精确搜索,需要使用双引号引起来:path:”/app/logs/nginx/access.log” 2.如果不带引号,将会匹配每个单词:uid token 3.模糊搜索: ...
- .NET调用腾讯云API实例
最近项目有用到腾讯云的身份识别接口,话不多说,直接上代码: private void IDCardVerification(HttpContext context) { string imgStr = ...
- linux的scp命令可以在linux服务器之间复制文件和目录
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- linux驱动开发随手记【1】
1.一个patch只完成一项任务 2.用vim编辑多个文件,想同时关闭所有文件时候,可以用 :qall 命令 .vim用户手册08 3.mmc dev 0.mmc为U-boot命令,这句话的含义是设置 ...
- Android笔记(五) Activity的启动模式
Android中Activity是由返回栈来管理的,在默认情况下,每当启动一个新的Activity,它都会在返回栈中入栈,并且出于栈的顶端.但是有些时候Activity已经在栈的顶端了,也就不需要再启 ...
- RestFramework之序列化组件
一.restframework的序列化组件的使用 1.导入序列化组件与模型类 from rest_framework import serializers from app01.models impo ...