思路:

用到了左偏树合并复杂度是logn的性质

一开始先BFS一遍

打标记的左偏树

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 600050
#define int long long
int n,m,h[N],fa[N],a[N],v[N],deep[N],s[N],c[N],root[N],vis[N];
int q[N],head,tail,ver[N],next[N],first[N],tot,ans[N],num[N];
struct Tree{int l,r,w,d,num,mul,add;}tr[N];
void add(int x,int y){ver[tot]=y,next[tot]=first[x],first[x]=tot++;}
void BFS(){
q[0]=1;
while(head<=tail){
int t=q[head++];
for(int i=first[t];~i;i=next[i]){
deep[ver[i]]=deep[t]+1;
q[++tail]=ver[i];
}
}
}
void push_down(int x){
int L=tr[x].l,R=tr[x].r;
tr[L].w=tr[L].w*tr[x].mul+tr[x].add;
tr[R].w=tr[R].w*tr[x].mul+tr[x].add;
tr[L].add*=tr[x].mul,tr[L].mul*=tr[x].mul,tr[L].add+=tr[x].add;
tr[R].add*=tr[x].mul,tr[R].mul*=tr[x].mul,tr[R].add+=tr[x].add;
tr[x].add=0,tr[x].mul=1;
}
int merge(int k1,int k2){
if(!k1||!k2)return k1+k2;
push_down(k1),push_down(k2);
if(tr[k1].w>tr[k2].w)swap(k1,k2);
tr[k1].r=merge(tr[k1].r,k2);
if(tr[tr[k1].l].d<tr[tr[k1].r].d)swap(tr[k1].l,tr[k1].r);
tr[k1].d=tr[tr[k1].r].d+1;
return k1;
}
void del(int &x){
push_down(x);
int L=tr[x].l,R=tr[x].r;
x=merge(L,R);
}
signed main(){
memset(first,-1,sizeof(first));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&h[i]);
for(int i=2;i<=n;i++){
scanf("%lld%lld%lld",&fa[i],&a[i],&v[i]);
add(fa[i],i),tr[i].mul=1;
}BFS();
for(int i=1;i<=m;i++){
scanf("%lld%lld",&s[i],&c[i]);
tr[i].w=s[i],tr[i].num=i;
root[c[i]]=merge(root[c[i]],i);
}
for(int i=tail;i>=0;i--){
while(root[q[i]]&&tr[root[q[i]]].w<h[q[i]]){
ans[tr[root[q[i]]].num]=deep[c[tr[root[q[i]]].num]]-deep[q[i]];
vis[tr[root[q[i]]].num]=1;
del(root[q[i]]);
num[q[i]]++;
}
push_down(root[q[i]]);
if(a[q[i]])tr[root[q[i]]].mul*=v[q[i]],tr[root[q[i]]].w=tr[root[q[i]]].w*v[q[i]];
else tr[root[q[i]]].add+=v[q[i]],tr[root[q[i]]].w=tr[root[q[i]]].w+v[q[i]];
root[fa[q[i]]]=merge(root[fa[q[i]]],root[q[i]]);
}
for(int i=1;i<=m;i++)if(!vis[i])ans[i]=deep[c[i]]+1;
for(int i=1;i<=n;i++)printf("%lld\n",num[i]);
for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
}

BZOJ 4003 左偏树的更多相关文章

  1. bzoj 2809 左偏树\平衡树启发式合并

    首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节 ...

  2. BZOJ 2333 左偏树 (写得我人生都崩溃了...)

    思路: 高一神犇 竟然 问我这道题   我光荣地  看着题解(划掉)  写了一下午 QaQ multiset不能erase(一个值)   这样就把等于这个值 的数都erase掉了  (woc我一开始不 ...

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

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

  4. bzoj 4003: 城池攻占 左偏树

    题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...

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

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

  6. BZOJ 1455 罗马游戏 ——左偏树

    [题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...

  7. bzoj 1455: 罗马游戏 左偏树+并查集

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Descriptio ...

  8. 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)

    1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ...

  9. BZOJ 2809: [Apio2012]dispatching(左偏树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题意: 思路:最简单的想法就是枚举管理者,在其子树中从薪水低的开始选起,但是每个节点都这样处理 ...

随机推荐

  1. 'mingw32-make' 不是内部或外部命令,也不是可运行的程序 或批处理文件。(的解决方案)

    问题如上. 解决方案:找到mingw32-make,方法是在计算中搜索 然后将其复制到C:Windows\System32下,需要管理员权限才能复制的情况下直接点继续.然后就可以了.

  2. 微信小程序踩坑记

    1:微信小程序之去掉横向滑动滚动条 /** 去除横向滚动条 */ ::-webkit-scrollbar { width: 0; height: 0; color: transparent; } 2: ...

  3. 【codeforces 348B】Apple Tree

    [题目链接]:http://codeforces.com/problemset/problem/348/B [题意] 给你一棵树; 叶子节点有权值; 对于非叶子节点: 它的权值是以这个节点为根的子树上 ...

  4. 逆向project第003篇:跨越CM4验证机制的鸿沟(上)

    一.前言 <冠军足球经理>系列作为一款拟真度极高的足球经营类游戏.赢得过无数赞誉,而CM4可以说是这个传奇的起点. 可是在游戏安装过程中.当用户输入完序列号之后.程序并不会对用户的输入进行 ...

  5. Hadoop Serialization -- hadoop序列化具体解释 (2)【Text,BytesWritable,NullWritable】

    回想: 回想序列化,事实上原书的结构非常清晰,我截图给出书中的章节结构: 序列化最基本的,最底层的是实现writable接口,wiritable规定读和写的游戏规则 (void write(DataO ...

  6. 图像切割—基于图的图像切割(Graph-Based Image Segmentation)

     图像切割-基于图的图像切割(Graph-Based Image Segmentation) Reference: Efficient Graph-Based Image Segmentation ...

  7. Hadoop2.6.0配置參数查看小工具

    前言 使用Hadoop进行离线分析或者数据挖掘的project师,常常会须要对Hadoop集群或者mapreduce作业进行性能调优. 或许你知道通过浏览器訪问http://master:18088/ ...

  8. angularjs 工具方法

    <!DOCTYPE HTML> <html ng-app> <head> <meta http-equiv="Content-Type" ...

  9. POJ 3013 Dijkstra

    从1节点最短路,,然后再乘一下权值就OK了 //By SiriusRen #include <queue> #include <cstdio> #include <cst ...

  10. WebView的坑[持续更新]

    返回错误的 innerHeight,如 240(WebView returns bad window.innerHeight) http://stackoverflow.com/questions/1 ...