BZOJ 4003 左偏树
思路:
用到了左偏树合并复杂度是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 左偏树的更多相关文章
- bzoj 2809 左偏树\平衡树启发式合并
首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节 ...
- BZOJ 2333 左偏树 (写得我人生都崩溃了...)
思路: 高一神犇 竟然 问我这道题 我光荣地 看着题解(划掉) 写了一下午 QaQ multiset不能erase(一个值) 这样就把等于这个值 的数都erase掉了 (woc我一开始不 ...
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- bzoj 4003: 城池攻占 左偏树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...
- BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...
- BZOJ 1455 罗马游戏 ——左偏树
[题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...
- bzoj 1455: 罗马游戏 左偏树+并查集
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 668 Solved: 247[Submit][Status] Descriptio ...
- 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)
1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ...
- BZOJ 2809: [Apio2012]dispatching(左偏树)
http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题意: 思路:最简单的想法就是枚举管理者,在其子树中从薪水低的开始选起,但是每个节点都这样处理 ...
随机推荐
- keepalived的功能及DR模式搭建笔记
一.HA集群中的相关术语 1.节点(node) 运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节 ...
- mac pro配置php开发环境
mac pro自带php和apache,所以我们只要配置下就好了 // 启动Apache服务 sudo apachectl start // 重启Apache服务 sudo apachectl res ...
- python 正则表达式与re模块
一.正则表达式 用途 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. #### 简单地说 就是用于字符串匹配的 字符组 在 ...
- ztree实现根节点单击事件,显示节点信息
这段时间在维护公司的项目,去年做的项目里面有ztree树的例子,想起之前还没有开始写博客,一些知识点也无从找起,要新加一个右击节点事件,折腾了半天,其中也包含了一些知识点,稍稍做了一些demo. zT ...
- POJ 2175 Evacuation Plan
Evacuation Plan Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Origina ...
- Qt之QFileIconProvider
简述 QFileIconProvider类为QDirModel和QFileSystemModel类提供了文件图标. 简述 共有类型 公共函数 示例 IconType 效果 源码 QFileInfo 效 ...
- 几周内搞定Java的10个方法
不要将Java与JavaScript弄混了,Java的目标是“一次编译,到处调试”(呃,不对,是“到处运行”).简单来说,就是Java程序可以直接在任何设备上运行. Java语言是什么? 不管我们是否 ...
- Zico源代码分析:执行启动过程分析和总结
事实上已经有童鞋对Zico的源代码和执行过程进行了总结,比如:http://www.cnblogs.com/shuaiwang/p/4522905.html.这里我再补充一些内容. 当我们使用mvn ...
- lua实现大数运算
lua实现的大数运算,代码超短,眼下仅仅实现的加减乘运算 ------------------------------------------------ --name: bigInt --creat ...
- 23.STL容器小结