「JLOI2015」城池攻占 可并堆
分析
如果直接暴力枚举的话肯定会超时
我们可以从下往上遍历,维护一个小根堆
每次到达一个节点把战败的骑士扔出去
剩下的再继续向上合并,注意要维护一下其实的战斗力
可以像线段树那样用一个lazy标记
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=300005;
typedef long long ll;
ll head[maxn],tot=1;
struct asd{
ll from,to,next,ty;
ll val;
}b[maxn];
void ad(ll aa,ll bb,ll cc,ll dd){
b[tot].from=aa;
b[tot].to=bb;
b[tot].ty=cc;
b[tot].val=dd;
b[tot].next=head[aa];
head[aa]=tot++;
}
ll bjc[maxn],bjj[maxn],gjl[maxn];
ll lch[maxn],rch[maxn];
void push_down(ll xx){
if(xx==0) return;
if(bjc[xx]!=1){
gjl[lch[xx]]*=bjc[xx],bjj[lch[xx]]*=bjc[xx],bjc[lch[xx]]*=bjc[xx];
gjl[rch[xx]]*=bjc[xx],bjj[rch[xx]]*=bjc[xx],bjc[rch[xx]]*=bjc[xx];
bjc[xx]=1;
}
if(bjj[xx]!=0){
gjl[lch[xx]]+=bjj[xx],bjj[lch[xx]]+=bjj[xx];
gjl[rch[xx]]+=bjj[xx],bjj[rch[xx]]+=bjj[xx];
bjj[xx]=0;
}
}
ll d[maxn],dep[maxn],rt[maxn];
ll h[maxn];
ll bing(ll xx,ll yy){
if(!xx) return yy;
if(!yy) return xx;
push_down(xx),push_down(yy);
if(gjl[xx]>gjl[yy]) swap(xx,yy);
rch[xx]=bing(rch[xx],yy);
if(d[lch[xx]]<d[rch[xx]]) swap(lch[xx],rch[xx]);
d[xx]=d[rch[xx]]+1;
return xx;
}
ll killl[maxn],atk[maxn];
ll cnt=0;
void dfs(ll xx){
for(ll i=head[xx];i!=-1;i=b[i].next){
ll u=b[i].to;
dep[u]=dep[xx]+1,dfs(u);
if(b[i].ty) gjl[rt[u]]*=b[i].val,bjj[rt[u]]*=b[i].val,bjc[rt[u]]*=b[i].val;
else gjl[rt[u]]+=b[i].val,bjj[rt[u]]+=b[i].val;
rt[xx]=bing(rt[xx],rt[u]);
}
while(rt[xx] && gjl[rt[xx]]<h[xx]){
killl[xx]++,atk[rt[xx]]=xx,push_down(rt[xx]),rt[xx]=bing(lch[rt[xx]],rch[rt[xx]]);
}
}
ll jl[maxn];
int main(){
memset(head,-1,sizeof(head));
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) scanf("%lld",&h[i]);
for(ll i=2;i<=n;i++){
ll aa;
ll bb,cc;
scanf("%lld%lld%lld",&aa,&bb,&cc);
ad(aa,i,bb,cc);
}
for(ll i=1;i<=m;i++){
bjc[i]=1;
ll bb;
scanf("%lld%lld",&gjl[i],&bb);
jl[i]=bb;
rt[bb]=bing(rt[bb],i);
}
d[0]=-1;
dep[1]=1;
dfs(1);
for(ll i=1;i<=n;i++) printf("%lld\n",killl[i]);
for(ll i=1;i<=n;i++) printf("%lld\n",dep[jl[i]]-dep[atk[i]]);
return 0;
}
「JLOI2015」城池攻占 可并堆的更多相关文章
- 「JLOI2015」城池攻占 解题报告
「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...
- 【LOJ】#2107. 「JLOI2015」城池攻占
题解 用一个平衡树维护能攻占到u点的骑士,合并到父亲的时候去掉攻击力小于父亲生命值的那部分,只要把那棵树拆掉并且将树中的所有骑士更新一下答案,用无旋式treap很好写 合并的时候只要启发式合并就可以了 ...
- 「JLOI2015」骗我呢 解题报告?
「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...
- 「JLOI2015」管道连接 解题报告
「JLOI2015」管道连接 先按照斯坦纳树求一个 然后合并成斯坦纳森林 直接枚举树的集合再dp一下就好了 Code: #include <cstdio> #include <cct ...
- 「JLOI2015」战争调度 解题报告
「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...
- 【BZOJ4003】[JLOI2015]城池攻占 可并堆
[BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号 ...
- 【BZOJ】【4003】【JLOI2015】城池攻占
可并堆 QAQ改了一下午……最终弃疗求助zyf……居然被秒了QAQ真是弱到不行(zyf太神了Orz) 还是先考虑部分分的做法: 1.$n,m\leq 3000$:可以暴力模拟每个骑士的攻打过程,也可以 ...
- BZOJ4003[JLOI2015]城池攻占——可并堆
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi ...
- BZOJ 4003 【JLOI2015】城池攻占
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, ...
随机推荐
- (三)Host头攻击
01 漏洞描述 为了方便获取网站域名,开发人员一般依赖于请求包中的Host首部字段.例如,在php里用_SERVER["HTTP_HOST"].但是这个Host字段值是不可信赖的( ...
- (数据科学学习手札86)全平台支持的pandas运算加速神器
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 随着其功能的不断优化与扩充,pandas已然成为 ...
- 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
- 温故知新-多线程-深入刨析synchronized
Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章目录 摘要 synchroniz ...
- JSP+Structs+JDBC+mysql实现的诚欣电子商城
项目简介 项目来源于:https://github.com/SuperiorNature/Java-Enterprise-electronic-mall 本系统是基于JSP+Structs+JDBC+ ...
- Hexo快速构建个人小站-自定义域名和自定义主题(二)
背景交代: 在上一章<Hexo快速构建个人小站-Hexo初始化和将项目托管在Github(一)>中,我们已经成功的利用hexo初始化了博客项目,并托管在Github上,且通过Github的 ...
- Linux MySQL Proxy 读写分离
导读 因为读写分离是建立在MySQL集群主从复制的基础上,还不了解的,先看我另一篇博客:点我直达 MySQL-Proxy简介 mysql-proxy是mysql官方提供的mysql中间件服务,上游可接 ...
- Netty中的这些知识点,你需要知道!
一.Channel Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口. Channel是一个门面,封装了包括网络I/O及相关的 ...
- Matlab 常用语法速记 1
===快捷帮助=== 查找帮助:doc 函数名 强制终止: ctrl + c 注释: % 清屏 clc,清临时变量窗口 clear NaN: not a number inf: infinite == ...
- xdebug调试代码常用操作
xdebug调试代码常用操作 1.查看变量中的值 2.常用快捷键 ①F8单步调试 ②F9可以直接快速结束调试 ③F7 可以进入调试代码的底层方法,我觉得查看底层代码时,这个特别的方便!