题目

luogu

原来左偏树真的能懒惰下放

这篇博客应该要咕咕了

一开始我按照那篇博客想了一下,感觉emm,还是瞄了一眼看到了pushdown

思路

类似线段树2的pushdown,不过是套在了左偏树

其他也就没啥了

ans1直接删除统计

ans2就初始深度-死亡深度(树的路径唯一嘛)

ps:深度可以在dfs的时候顺便求出来

就这样

错误&&反思

一开始20,死活不对

最后又是手贱n写成m

还是20

又经过漫长debug(不会造树data的伤感)

无奈去看题解,长着差不多的模样

最后

 while(val[rt[u]] < fangyu[u] && rt[u]) {
pushdown(rt[u]);
ans2[rt[u]]=dep[S[rt[u]]]-dep[u];
ans1[u]++;
rt[u]=merge(ch[rt[u]][0],ch[rt[u]][1]);
}

居然一个pushdown就OK了

我想着是merge就会pushdown的,就没写、、、、

代码

#include <iostream>
#include <cstdio>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=3e5+7;
typedef long long ll;
inline ll read() {
ll x=0,f=1;char s=getchar();
for(;s<'0'||s>'9';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
struct node {
int v,nxt;
}e[maxn];
int head[maxn],tot;
void add_edge(int u,int v) {
e[++tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
}
int n,m,cnt,rt[maxn],ch[maxn][2],dis[maxn],ans1[maxn],ans2[maxn],dep[maxn];
ll A[maxn],B[maxn],fangyu[maxn],ad[maxn],mu[maxn],val[maxn];
void da_tag(int x,ll a,ll b) {
val[x]=val[x]*a+b;
ad[x]=ad[x]*a+b;
mu[x]*=a;
}
void pushdown(int x) {
if(ad[x]==0&&mu[x]==1) return;
int it_a=ch[x][0],it_b=ch[x][1];
da_tag(it_a,mu[x],ad[x]);
da_tag(it_b,mu[x],ad[x]);
ad[x]=0,mu[x]=1;
}
int merge(int x,int y) {
if(!x || !y) return x+y;
pushdown(x),pushdown(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 S[maxn];
int dfs(int u,int f) {
dep[u]=dep[f]+1;
for(int i=head[u];i;i=e[i].nxt) {
int tmp=dfs(e[i].v,u);
rt[u]=merge(rt[u],tmp);
}
while(val[rt[u]] < fangyu[u] && rt[u]) {
pushdown(rt[u]);
ans2[rt[u]]=u;
ans1[u]++;
rt[u]=merge(ch[rt[u]][0],ch[rt[u]][1]);
}
da_tag(rt[u],A[u],B[u]);
return rt[u];
}
int main() {
n=read(),m=read();
FOR(i,1,m) mu[i]=1;
FOR(i,1,n) fangyu[i]=read();
FOR(i,2,n) {
int x=read(),y=read();
add_edge(x,i);
A[i]=1;
if(y) A[i]=read();
else B[i]=read();
}
FOR(i,1,m) {
ll x=read();S[i]=read();
val[i]=x;
rt[S[i]]=merge(rt[S[i]],i);
}
dfs(1,0);
FOR(i,1,n) cout<<ans1[i]<<"\n";
FOR(i,1,m) cout<<dep[S[i]]-dep[ans2[i]]<<"\n";
return 0;
}

luogu3261 懒惰左偏树 [JLOI2015]城池攻占的更多相关文章

  1. [luogu3261 JLOI2015] 城池攻占 (左偏树+标记)

    传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的 ...

  2. 【BZOJ4003】【JLOI2015】城池攻占(左偏树)

    题面 题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi ...

  3. [JLOI2015]城池攻占 左偏树

    题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...

  4. 【左偏树】【P3261】 [JLOI2015]城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其 ...

  5. [洛谷P3261] [JLOI2015]城池攻占(左偏树)

    不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...

  6. P3261 [JLOI2015]城池攻占 (左偏树+标记下传)

    左偏树还是满足堆的性质,节点距离就是离最近的外节点(无左或者右儿子  或者二者都没有)的距离,左偏性质就是一个节点左儿子的距离不小于右儿子,由此得:节点距离等于右儿子的距离+1. 本题就是对于每个节点 ...

  7. BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆

    https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...

  8. BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)

    左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...

  9. 【左偏树】 [JLOI2015]城池攻占

    原来左偏树还可以打tag,get了 和线段树打tag一样,时不时Push_Down就好了 然后这里显然也是要先乘法后加法的 tag打上了之后还是其他一般左偏树差不多,有些细节注意一下 然后开 long ...

随机推荐

  1. PHP移动互联网开发笔记(6)——MySQL数据库基础回想

    近期看了一些架构方面的资料.可是发现基础知识都不怎么坚固,接下来的一段时间.我会定期总结基础知识. 一.数据类型   1.整型   数据类型 存储空间 说明 取值范围 TINYINT 1字节 很小的整 ...

  2. 【剑指offer】栈的压入、弹出序列

    一.题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该 ...

  3. glide从入门到精通使用

    介绍 不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题.Java有牛逼轰轰的Maven和Gradle. Golang亦有godep.govendor.glide.gvt.gopac ...

  4. CloudFlare Support - Error 522: Connection timed out 错误522:连接超时

    522错误意味着我们无法在所有到达原点Web服务器. 这方面有几个主要原因: 原始服务器太超载回应. 源Web服务器具有挡住了我们的请求的防火墙,或者数据包被主机的网络内下降. 源Web服务器脱机,或 ...

  5. C语言标准函数源代码

    http://ftp.gnu.org/gnu/glibc/ 最新glibc-2.27.tar.gz 直接解压就可以

  6. Linux系统——Keepalived高可用集群

    #### keepalived服务的三个重要功能1. 管理LVS负载均衡软件Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能,这使得 ...

  7. C# 实现屏幕截屏

    //屏幕宽            int iWidth = Screen.PrimaryScreen.Bounds.Width;            //屏幕高            int iHe ...

  8. Verilog篇(四)时序模型

    时序模型:仿真器的时间推进模型,它反映了推进仿真时间和调度事件的方式. 1)门级时序模型:适用于分析所有的连续赋值语句,过程连续赋值语句,门级原语,用户自定义原语. 特点:任意时刻,任意输入变化都将重 ...

  9. 概率检索模型:BIM+BM25+BM25F

    1. 概率排序原理 以往的向量空间模型是将query和文档使用向量表示然后计算其内容相似性来进行相关性估计的,而概率检索模型是一种直接对用户需求进行相关性的建模方法,一个query进来,将所有的文档分 ...

  10. spring mvc interceptors

    <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:e ...