正题

题目链接:https://www.luogu.com.cn/problem/P3261


题目大意

nnn个点的树,每个节点有一个防御值和一个攻击后的影响(让你的伤害加上一个数或者乘上一个数)

然后mmm个骑士,给定初始攻击点和初始伤害,不停往上走,遇到防御小于他伤害的城堡就攻占否则就死亡

求每个城堡干死了多少个勇士,每个勇士干死了多少个城堡。


解题思路

显然以伤害建立一个小根堆,每次想不满足的丢出去,然后打上延迟标记全部修改。然后每次把所有子树的堆都合并。

这里比较懒就骑士和节点都建立了堆,所有速度比较慢。


codecodecode

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=6e5+10;
ll n,m,h[N],dep[N],ans1[N],ans2[N],val[N];
struct Left_Tree{#define ls t[x][0]#define rs t[x][1]ll fa[N],add[N],mul[N],dis[N],t[N][2];void Change(ll x,ll v1,ll v2){if(!x) return;val[x]*=v1;val[x]+=v2;add[x]*=v1;mul[x]*=v1;add[x]+=v2;return;}void PushDown(ll x){Change(ls,mul[x],add[x]);Change(rs,mul[x],add[x]);mul[x]=1;add[x]=0;return;}ll Get(ll x){return (fa[x]==x)?(x):(fa[x]=Get(fa[x]));}ll Merge(ll x,ll y){if(!x||!y) return x+y;if(val[x]>val[y]) swap(x,y);PushDown(x);PushDown(y);rs=Merge(rs,y);fa[ls]=fa[rs]=x;if(dis[ls]<dis[rs]) swap(ls,rs);dis[x]=dis[rs]+1;return x;}void Del(ll x){PushDown(x);Change(x,0,0);fa[ls]=ls;fa[rs]=rs;fa[x]=Merge(ls,rs);return;} #undef ls#undef rs
}T;
struct node{ll to,next;
}a[N];
ll mul[N],add[N],s[N],ls[N],tot;
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(ll x){for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;dep[y]=dep[x]+1;dfs(y);T.Merge(T.Get(x),T.Get(y));}ll k;while(val[k=T.Get(x)]<h[x]&&k){if(k>n){ans1[x]++;ans2[k-n]=dep[s[k-n]]-dep[x];}T.Del(k);}T.Change(T.Get(x),mul[x],add[x]);return;
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&h[i]),T.fa[i]=i,mul[i]=1;for(ll i=2;i<=n;i++){ll op,x,y;scanf("%lld%lld%lld",&x,&op,&y);if(op) mul[i]=y;else add[i]=y;addl(x,i);}for(ll i=1;i<=m;i++){scanf("%lld%lld",&val[i+n],&s[i]);ans2[i]=-1;T.fa[i+n]=i+n;T.Merge(i+n,T.Get(s[i]));}dep[1]=1;dfs(1);for(ll i=1;i<=n;i++)printf("%lld\n",ans1[i]);for(ll i=1;i<=m;i++)if(ans2[i]<0) printf("%lld\n",dep[s[i]]);else printf("%lld\n",ans2[i]);return 0;
}

P3261-[JLOI2015]城池攻占【左偏树】相关推荐

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

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

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

    传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始dfs,每一次把子树里那些还活着的骑士合并上来 然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的 ...

  3. 【左偏树】【P3261】 [JLOI2015]城池攻占

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

  4. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  5. 《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并

    本节书摘来自华章计算机<程序设计解题策略>一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.6 利用左偏树实 ...

  6. 【洛谷3377】 左偏树(可并堆)

    前言 其实我是不小心翻线性基的时候看见的. Solution 左偏树只会模板,挖坑待补 代码实现 #include<stdio.h> #include<stdlib.h> #i ...

  7. P3642 [APIO2016]烟火表演(左偏树、函数)

    解析 感觉是左偏树的神题了. 首先有一个比较显然的结论,一个合法的方案中,两个叶子到它们 lca\text{lca}lca 的距离必须相等. 考虑设计 dp\text{dp}dp : fi,xf_{i ...

  8. YbtOJ#631-次短路径【左偏树,最短路】

    正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/1 题目大意 给出nnn个点mmm条边的一张无向图,对于每个点iii求不经过i∼1i\sim ...

  9. P4331-[BalticOI2004]Sequence数字序列【左偏树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4331 题目大意 给出一个序列aaa,求一个单调上升的序列bbb使得∑i=1n∣ai−bi∣\sum_{i=1}^ ...

  10. P1552-[APIO2012]派遣【左偏树】

    正题 题目链接:https://www.luogu.com.cn/problem/P1552 题目大意 一个nnn个点森林,每个点有价值和代价,选择一个点并在这个点的子树中选择一些点使得. 选择的点数 ...

最新文章

  1. 基于 Android NDK 的学习之旅-----资源释放
  2. 创建并运行HelloWorld Java项目和类
  3. 大学计算机基础python学多久_怎么自学python,大概要多久?
  4. Linux命令 比较文件
  5. 解决github图片不显示问题【完美解决】
  6. Java中的装箱和拆箱剖析
  7. 【Openstack】实录手动部署Openstack Rocky 双节点(5)- Neutron
  8. 【Flink】双亲委派模型与Flink的类加载策略 child-first parent-first
  9. 浅谈接龙红包的技术实现
  10. )C# Enum,Int,String的互相转换 枚举转换
  11. android蓝牙动态权限,Android蓝牙权限
  12. 图像坐标球面投影_C/C++ 图像处理(7)------图像の球面投影算法
  13. Linux内核4.14版本——alsa框架分析(3)-PCM设备的创建
  14. vue路由守卫的执行顺序
  15. 颜色所代表的人的性格
  16. Android-简单单词书app
  17. uniapp获取当前页面路由及参数 _@jie
  18. JS获取照片拍摄的角度属性,用于旋转控制
  19. .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持
  20. 农场元宇宙Plato Farm,乌托邦式田园生活

热门文章

  1. 30屏幕参数_顶级屏幕加持,一加8系列核心配置、屏幕参数官方公布
  2. java如何运行一个任务_如何每天从Java运行任务?
  3. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程
  4. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站
  5. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
  6. easyui 动态设置单元格控件_动态显示最大最小值的折线图
  7. 开发板实现645协议C语言,迅为-imx6ull开发板之C语言实现LED例程
  8. Java 多线程:线程优先级
  9. Java继承-子类不可以继承父类的构造方法
  10. [Java基础]线程基础与实现多线程