https://www.lydsy.com/JudgeOnline/problem.php?id=4003

感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始终保持右边堆的深度比左边堆的小一些以保证复杂度,大概因为这个所以也叫左偏树吧。

这个题我最开始看错题目了所以看板子的时候一头雾水满脑子都是“这个实现有问题吧”,然后又看了一遍题目发现没问题骑士就是往上走的。

这道题是把每个点建一个堆然后从叶子到根向上传递+去掉没法再往上的,复杂度大概是O(nlogn)?

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
long long read(){
long long x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(''<=ch&&ch<=''){ x=x*+ch-'';ch=getchar(); }
return x*f;
}
int n,m;
long long h[maxn]={},k[maxn]={},b[maxn]={},s[maxn]={};
int fa[maxn]={},c[maxn]={};
int rt[maxn]={},ans1[maxn]={},ans2[maxn]={};
struct use{ int y,next; }e[maxn];
int head[maxn]={},dep[maxn]={},tot=;
struct hp{ long long k,b,v; int dis,l,r; }t[maxn];
void init(int x,int y){
e[++tot].y=y;e[tot].next=head[x];head[x]=tot;
}
inline void Ad(int x,long long tk,long long tb){
t[x].k*=tk;
t[x].b=t[x].b*tk+tb;
t[x].v=t[x].v*tk+tb;
}
inline void downdata(int x){
if(t[x].l)Ad(t[x].l,t[x].k,t[x].b);;
if(t[x].r)Ad(t[x].r,t[x].k,t[x].b);
t[x].k=;t[x].b=;
}
int merge(int x,int y){
if(!x)return y;if(!y)return x;
downdata(x);downdata(y);
if(t[x].v>t[y].v)swap(x,y);
t[x].r=merge(t[x].r,y);
if(t[t[x].r].dis>t[t[x].l].dis)swap(t[x].r,t[x].l);
t[x].dis=t[t[x].r].dis+;
return x;
}
void dfs(int x){
int y;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
dep[y]=dep[x]+;
dfs(y);Ad(rt[y],k[y],b[y]);
rt[x]=merge(rt[x],rt[y]);
}
while(rt[x]&&t[rt[x]].v<h[x]){
downdata(rt[x]);ans1[x]++;
ans2[rt[x]]=dep[c[rt[x]]]-dep[x];
rt[x]=merge(t[rt[x]].l,t[rt[x]].r);
}
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)h[i]=read();
for(int i=;i<=n;i++){
fa[i]=read();init(fa[i],i);
k[i]=read();b[i]=read();
if(!k[i])k[i]=;
else{k[i]=b[i];b[i]=;}
}
for(int i=;i<=m;i++){
s[i]=read();c[i]=read();
t[i].k=; t[i].b=; t[i].v=s[i];
rt[c[i]]=merge(rt[c[i]],i);
}dep[]=;
dfs();
while(rt[]){
downdata(rt[]);
ans2[rt[]]=dep[c[rt[]]];
rt[]=merge(t[rt[]].l,t[rt[]].r);
}
for(int i=;i<=n;i++)printf("%d\n",ans1[i]);
for(int i=;i<=m;i++)printf("%d\n",ans2[i]);
return ;
}

BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆的更多相关文章

  1. bzoj 4003 [JLOI2015]城池攻占 —— 左偏树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...

  2. BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...

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

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

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

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

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

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

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

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

  7. [BZOJ4003][JLOI2015]城池攻占(左偏树)

    这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...

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

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

  9. BZOJ 4003 JLOI2015 城池攻占

    做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...

随机推荐

  1. C++的各种初始化方式

    C++小实验测试:下面程序中main函数里a.a和b.b的输出值是多少? #include <iostream> struct foo { foo() = default; int a; ...

  2. 20165230 2017-2018-2 《Java程序设计》第5周学习总结

    20165230 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类与外嵌类 可以在类中定义另一个类,即内部类 包含内部类的类为内 ...

  3. Python标准库笔记(6) — struct模块

    该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换.这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其他数据源. 用途: 在Python基本数据类型和二进制数 ...

  4. flask基础之蓝图的使用(七)

    前言 关于蓝图是什么?或为什么使用蓝图的详细介绍,官方文档讲的很详细,不再赘述.简单来说,在大型的应用中,我们不想视图函数显得杂乱无章,难以维护,将众多的视图函数按照Api的设计规则进行切割是一个好方 ...

  5. Logback的继承体系

    今天碰到一个问题,发现控制台日志输出两遍,搜索得知,这个是由于logback继承体系导致的. logback不仅会继承level,也会继承appender,需要注意的是: <root> & ...

  6. 简单的搭mysql开发环境

    所需软件  环境win8 64bit mysql5.7.16winx64.zip mysql-workbench-community-6.3.5-win32.zip 安装完了之后到mysql/bin下 ...

  7. IP地址、域名、域名解析系统相关

    IP地址(Internet Protocol Address) 它来自TCP/IP协议,存在于其中的IP层,用于实现不同计算机之间的通信,类似于门牌号. 设计之处,IP地址是准备给地球上每一台计算机一 ...

  8. 20165203《Java程序设计》第九周学习总结

    20165203<Java程序设计>第九周学习总结 教材学习内容总结 URL类 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符,使用URL创建对象的应用 ...

  9. Python 面试题学习

    Python的函数参数传递 在Python中,strings,tuples=('abc',123,2.2,'join),numbers 是不可更改的对象. list=['abc',123,2.23,' ...

  10. 从一道简单的dp题中学到的...

    今天想学点动态规划的知识,于是就看了杭电的课件,数塔问题啊,LCS啊都是比较经典的动规了,然后随便看了看就开始做课后练习题... HDOJ 1421 搬寝室 http://acm.hdu.edu.cn ...