P3066 [USACO12DEC]逃跑的BarnRunning Away From
题目
思路
虽说这个题目有多种做法,但
左偏树算法:
我们发现这个合并的时候并不好合并,因为存的值不是固定的
那我们是不是可以lazy数组呢
因为是两个颗树合并,显然是步阔以的
那就转换一下思路,什么是固定的呢
那就是1到i的路径
我们可以dfs出val[i]表示1到i的路径和
这个val也就是左偏树的初始值
然后我们发现,一个树i的所有后代x
都要经过1到i的所经过的路径
所以直接维护val,只需要在比较的时候减去val[i]即可
感觉我说的太恶心了,还是去看代码吧
错误&&注意
这个空间和long long让我wrong了4次,小心点吧
代码
// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=200007;
typedef long long ll;
inline ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
struct edge {
int v,nxt;
ll q;
}e[maxn<<1];
int head[maxn<<1],tot;
void add_edge(int u,int v,ll q) {
e[++tot].v=v;
e[tot].q=q;
e[tot].nxt=head[u];
head[u]=tot;
}
int n;
ll m,val[maxn];
int ans[maxn],size[maxn];
int ch[maxn][2],dis[maxn];
int merge(int x,int y) {
if(!x||!y) return x+y;
if(val[x]<val[y]) swap(x,y);
ch[x][1]=merge(ch[x][1],y);
if(dis[ch[x][0]]<dis[ch[x][1]]) swap(ch[x][0],ch[x][1]);
dis[x]=dis[ch[x][1]]+1;
return x;
}
int work1(int x,int y) {
int tmp=merge(x,y);
y=x^y^tmp;
x=tmp;
size[x]+=size[y];
return tmp;
}
int work2(int x) {
int tmp=merge(ch[x][0],ch[x][1]);
size[tmp]=size[x]-1;
return tmp;
}
int dfs(int u,int f) {
ans[u]=1;
int rt=u;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(v==f) continue;
int tmp=dfs(v,u);
rt=work1(rt,tmp);
}
while(val[rt]-val[u] > m) rt=work2(rt);
ans[u]=size[rt];
return rt;
}
void nb_dfs(int u,int f) {
size[u]=1;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(v==f) continue;
val[v]=val[u]+e[i].q;
nb_dfs(v,u);
}
}
int main() {
n=read(),m=read();
FOR(i,2,n) {
int x=read();
ll y=read();
add_edge(i,x,y);
add_edge(x,i,y);
}
nb_dfs(1,0);
dfs(1,0);
FOR(i,1,n) cout<<ans[i]<<"\n";
return 0;
}
P3066 [USACO12DEC]逃跑的BarnRunning Away From的更多相关文章
- 洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…
题面链接 一句话题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 我:似乎并不好做啊...看了题解后大雾... sol:考虑树上差分,对于一个点,在他那个位置++, ...
- 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 ...
- [USACO12DEC] 逃跑的BarnRunning Away From…(主席树)
[USACO12DEC]逃跑的BarnRunning Away From- 题目描述 It's milking time at Farmer John's farm, but the cows hav ...
- luoguP3066 [USACO12DEC]逃跑的BarnRunning
luoguP3066 [USACO12DEC]逃跑的BarnRunning 题目大意 给定一棵n个节点的树和参数L,查询每个节点子树中到达该节点距离<=L的数量(包括该节点) 偏模板的主席树 P ...
- 洛谷P3066 [USACO12DEC] 逃跑的Barn [左偏树]
题目传送门 逃跑的Barn 题目描述 It's milking time at Farmer John's farm, but the cows have all run away! Farmer J ...
- P3066 [USACO12DEC] 逃跑的Barn 左偏树
P3066 逃跑的Barn 左偏树 题面 题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 注意到答案的两个性质: 一个点的所有答案一定包含在其所有儿子的答案中 如 ...
- [Luogu3066][USACO12DEC]逃跑的BarnRunning Away From…
题面 题目描述 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 输入格式: Line 1: 2 integers, N and L (1 <= N <= 2 ...
- [USACO12DEC]逃跑的BarnRunning Away From…
题意 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个 题解 似乎有好多种做法啊……然而蒟蒻只会打打主席树的板子…… 调了一个上午一直WA……狠下心来重打一遍居然直接一遍过 ...
随机推荐
- [python]去掉 unicode 字符串前面的 u(转)
add by zhj: 其实一般情况下,不会遇到变量c这种编码的,往往是哪些出错了,才会出现这种情况.所以遇到这种情况,要先 查看代码,避免这种情况的出现 原文:https://mozillazg.c ...
- Tensorflow(二)
1---------------- 试用tensorflow的模块,必须配套tensorflow的方法 import tensorflow as tf a=3 ##定义 行向量 w=tf.Variab ...
- Tomcat项目部署的三种方法
第一种方法如下:直接把我们的项目文件夹放到tomcat里面,在这里我自己做的是一个测试项目oa,如图 启动tomcat,打开浏览器,输入localhost/oa 即可打开你的文件,注意 :访问的时候 ...
- latex 安装和使用
1:下载 texlivewindows 版 http://tug.org/texlive/acquire-netinstall.html 2:双击exe文件进行安装,安装时选择 将路径添加到环境变量 ...
- 5分钟实现集群-NTP时间同步
环境:VMware-Workstation-12-Pro,Windows-10,CentOS-7.5,Xshell5 NTP基本介绍 NTP(Network TimeProtocol,网络时间协议), ...
- FDR错误发现率-P值校正学习[转载]
转自:https://baike.baidu.com/item/FDR/16312044?fr=aladdin https://blog.csdn.net/taojiea1014/article/d ...
- 5select的运用
四.select的运用 --汇总函数 max()最大值,min()最小值,avg()平均值select max(age),min(age),avg(age) from tablename; --算出表 ...
- yii2模板
GridView 小部件在开发中常用的功能及技巧.持续更新中.... 数据网格或者说 GridView 小部件是Yii中最强大的部件之一.它有一个属性名叫 dataProvider ,这个属性能够提供 ...
- java opencv使用相关
Using OpenCV Java with Eclipse http://docs.opencv.org/2.4/doc/tutorials/introduction/java_eclipse/ja ...
- Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner)
前言 批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLT ...