做法和APIO2012派遣 那道题目类似

在树上DFS,维护当前子树的小根堆

因为需要合并孩子们的信息,使用左偏树就可以了

每次弹出死亡骑士,对剩余骑士打上奖励标记

至于标记的下传和更改,只需要每次在需要遍历到这个点之前push_down就可以了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std; typedef long long LL;
const int maxn=300010;
int n,m;
int a[maxn],rt[maxn],fa[maxn],c[maxn];
int ans1[maxn],ans2[maxn];
LL f[maxn],k[maxn],b[maxn],s[maxn];
int h[maxn],cnt=0;
int dep[maxn];
struct edge{
int to,next;
}G[maxn];
struct Tree{
int L,R,dis;
LL v,k,b;
}t[maxn];
void add(int x,int y){++cnt;G[cnt].to=y;G[cnt].next=h[x];h[x]=cnt;}
void Get_mark(int a,LL k,LL b){
if(a==0)return;
t[a].v=t[a].v*k+b;
t[a].k*=k;t[a].b*=k;t[a].b+=b;
}
void push_down(int a){
Get_mark(t[a].L,t[a].k,t[a].b);
Get_mark(t[a].R,t[a].k,t[a].b);
t[a].k=1;t[a].b=0;
}
int merge(int a,int b){
if(!a||!b)return a+b;
push_down(a);push_down(b);
if(t[a].v>t[b].v)swap(a,b);
t[a].R=merge(t[a].R,b);
if(t[t[a].R].dis>t[t[a].L].dis)swap(t[a].L,t[a].R);
t[a].dis=t[t[a].R].dis+1;
return a;
}
void DFS(int u){
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
dep[v]=dep[u]+1;
DFS(v);
Get_mark(rt[v],k[v],b[v]);
rt[u]=merge(rt[u],rt[v]);
}
while(rt[u]&&t[rt[u]].v<f[u]){
push_down(rt[u]);ans1[u]++;
ans2[rt[u]]=dep[c[rt[u]]]-dep[u];
rt[u]=merge(t[rt[u]].L,t[rt[u]].R);
}return;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%lld",&f[i]);
for(int i=2;i<=n;++i){
scanf("%d%lld%lld",&fa[i],&k[i],&b[i]);
if(k[i]==0)k[i]=1;
else k[i]=b[i],b[i]=0;
add(fa[i],i);
}
for(int i=1;i<=m;++i){
scanf("%lld%d",&s[i],&c[i]);
t[i].v=s[i];t[i].k=1;t[i].b=0;
rt[c[i]]=merge(rt[c[i]],i);
}
DFS(1);
while(rt[1]){
push_down(rt[1]);
ans2[rt[1]]=dep[c[rt[1]]]+1;
rt[1]=merge(t[rt[1]].L,t[rt[1]].R);
}
for(int i=1;i<=n;++i)printf("%d\n",ans1[i]);
for(int i=1;i<=m;++i)printf("%d\n",ans2[i]);
return 0; }

  

BZOJ 4003 JLOI2015 城池攻占的更多相关文章

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

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

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

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

  3. BZOJ_4003_[JLOI2015]城池攻占_可并堆

    BZOJ_4003_[JLOI2015]城池攻占_可并堆 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 ...

  4. 【BZOJ4003】[JLOI2015]城池攻占 可并堆

    [BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号 ...

  5. Luogu 3261 [JLOI2015]城池攻占

    BZOJ 4003 需要实现一个可并堆. 每个点维护一个小根堆,然后一开始把所有骑士加入到它所在的点的小根堆当中,实际上空间是$O(m)$的,然后我们从上到下不断合并这个小根堆,合并完之后如果遇到堆顶 ...

  6. [bzoj4003][JLOI2015]城池攻占_左偏树

    城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...

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

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

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

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

  9. BZOJ4003:[JLOI2015]城池攻占——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4003 https://www.luogu.org/problemnew/show/P3261 小铭 ...

随机推荐

  1. IOS 下拉菜单

    由于之前曾经用到过下拉菜单,所以现在花一些时间回过头来细细整理了一下,逐步完善这个下拉菜单,并提供一些比较基本的功能,以便日后如果有需要的话可以进行复用,并提供给需要的人参考.下拉菜单同样分为数据源和 ...

  2. easyui combobox 模糊检索数据并填充

    $("#id"),combobox({ url:'', ......   filter:function(q,row){ var op = $(this).combobox(&qu ...

  3. PHP自定义日期英文格式 Feb 11,2015

    背景:[PHP小工具]项目中,经常会要求多版本语言支持,而日期也是必不可少的组成元素. 英文日期书写顺序分英式和美式,举例如. 美国:月日年(January 8th,2014 或 January 8, ...

  4. System.Windows.Forms.Timer

    一.主要属性.方法和事件 Windows 窗体 Timer 是定期引发事件的组件.该组件是为 Windows 窗体环境设计的. 时间间隔的长度由 Interval 属性定义,其值以毫秒为单位.若启用了 ...

  5. Mysql 的安装与配置

    MySQL的安装 第1步:下载 第2 步:以管理员身份进行安装 第3步:选择安装类型. 第4步:设置MySQL安装目录,及数据库文件目录 第5步:安装结束,开启配置向导 第6步:选择配置类型 第7步: ...

  6. Adapter模式

    Adapter模式主要用于将一个类的接口转换为另外一个接口,通常情况下再不改变原有体系的条件下应对新的需求变化,通过引入新的适配器类来完成对既存体系的扩展和改造.实现方式主要包括: 1.类的Adapt ...

  7. 《QQ欢乐斗地主》山寨版

    使用Cocos2d-x编写,模仿<QQ欢乐斗地主>的界面实现了一个具有简单AI的单机版斗地主游戏. 游戏的详细说明请查看游戏目录下的help.txt文件. 下载地址: http://dow ...

  8. VS2010 常见错误总结

    错误一:“此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的,请稍后重试” 安装VS2010补丁:http://xiazai.jb51.net/201007/tools/V ...

  9. SQL Server 2008 安装或卸载时提示“重启计算机失败"的解决办法(转)

    安装或卸载SQL Server 遇到错误提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机.如下图: 解决办法: 1.在开始->运行中输入regedi ...

  10. Python 中的引用和类属性的初步理解

    最近对Python 的对象引用机制稍微研究了一下,留下笔记,以供查阅. 首先有一点是明确的:「Python 中一切皆对象」. 那么,这到底意味着什么呢? 如下代码: #!/usr/bin/env py ...