BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
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]城池攻占 左偏树 可并堆的更多相关文章
- bzoj 4003 [JLOI2015]城池攻占 —— 左偏树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...
- [洛谷P3261] [JLOI2015]城池攻占(左偏树)
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...
- BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...
- [JLOI2015]城池攻占 左偏树
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...
- [luogu3261 JLOI2015] 城池攻占 (左偏树+标记)
传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的 ...
- [BZOJ4003][JLOI2015]城池攻占(左偏树)
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...
- bzoj 4003: 城池攻占 左偏树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...
- BZOJ 4003 JLOI2015 城池攻占
做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...
随机推荐
- 查看 CUDA cudnn 版本
cuda 版本 cat /usr/local/cuda/version.txt cudnn 版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MA ...
- VM虚拟机上连接usb无反映
主机的usb连接又是正常的,排除了usb3.0的接口原因后,突然想到了是不是虚拟机的什么服务没有开?进入到控制面板->管理工具->服务,找到 V开头的,发现原来确实是虚拟机有关usb的服务 ...
- 20155303狄惟佳预备作业三Linux学习笔记
20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...
- 配置虚拟机时间使其与国内时间同步,linux时间 ntp
设置系统时间 [root@node2 ~]# date -s "10/30/18 09:30:00"Tue Oct 30 09:30:00 PDT 2018[root@node2 ...
- 25 个常用的 Linux iptables 规则【转】
转自 25 个常用的 Linux iptables 规则 - 文章 - 伯乐在线http://blog.jobbole.com/108468/ # 1. 删除所有现有规则 iptables -F # ...
- jquery记忆笔记
1.javascript需要注意的一些问题: ①不要使用==比较,始终坚持使用===比较. false == 0; // true false === 0; // false ②NaN这个特殊的Num ...
- Django集成Xadmin list index out of range报错解决方案
return self.render(context) File "C:\Python36\lib\site-packages\django\template\defaulttags.py& ...
- vue总结05 过渡--状态过渡
状态过渡 Vue 的过渡系统提供了非常多简单的方法设置进入.离开和列表的动效.那么对于数据元素本身的动效呢,比如: 数字和运算 颜色的显示 SVG 节点的位置 元素的大小和其他的属性 所有的原始数字都 ...
- 面试经典问题---数据库索引B+、B-树
具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解.如人们可能会以为B-树 ...
- elasticsearch文档学习
1.集群 节点(一个elasticsearch实体) 索引 主节点 :集群级别变更,新增或移除节点,索引: 主节点不参与文档级别搜索和变更. 分片(shard):一个完整的搜索引擎,lucene ...