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. UNIX网络编程 第5章 TCP客户/服务器程序示例

    UNIX网络编程 第5章 TCP客户/服务器程序示例

  2. Struts2笔记1:--Struts2原理、优点、编程流程、6大配置文件以及核心配置文件struts.xml

    Struts2原理(底层使用的是Servlet的doFilter方法): Struts2优点: 第一个Struts程序: 在开发Struts程序之前,首先要导入额外的jar包,基本需求的是14个jar ...

  3. 7 SQL优化技术

    7.1 改变访问结构 7.2 修改SQL语句 SELECT deptno   FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp); SELEC ...

  4. Maven仓库国内镜像站

    感谢阿里巴巴,搭建并公开了Maven仓库的国内镜像站.话外:使用Maven的官方仓库真的是太slow了! 在<Maven Root>/conf/settings.xml中的<mirr ...

  5. 【Linux技术】autotools制作makefile过程详解【转】

    转自:http://www.cnblogs.com/lcw/p/3159461.htmlPreface Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件 ...

  6. 曹冲称象小游戏pygame实现

    #!/usr/bin/env python # -*- coding: UTF-8 -*- import pygame from pygame.locals import * from sys imp ...

  7. linux查看目录的四种方法(ls只显示目录)【转】

    1.ls -d * amosli@amosli-pc:~$ ls -d * %APPDATA% develop many sorted.txt workspace bank Documents Mus ...

  8. 使用数据库管理工具打开MySql

    1.推荐使用软件:Navicat_Premium_11.0.10.exe.  下载地址:http://pan.baidu.com/s/1nu6mTF7 2.下载上面文件并安装. 3.打开Navicat ...

  9. maven2 up to maven3的'version' contains an expression but should be a constant

    在Maven2时,为了保障版本一致,一般之前我们的做法时: Parent Pom中 <project xmlns="http://maven.apache.org/POM/4.0.0& ...

  10. C# 托管资源 与 非托管资源

    C# 托管资源 与 非托管资源 托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,.NET可以自动进行回收,主要是指托管堆上分配的内存资源.例如程序中分配的对象,作用域内的变量 ...