P3261 [JLOI2015]城池攻占 (左偏树+标记下传)
左偏树还是满足堆的性质,节点距离就是离最近的外节点(无左或者右儿子 或者二者都没有)的距离,左偏性质就是一个节点左儿子的距离不小于右儿子,由此得:节点距离等于右儿子的距离+1。
本题就是对于每个节点都建立一颗左偏树(小根堆),存的是在当前节点的骑士,从下往上模拟题意就行了。
1 #include <bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 const int N = 3e5 + 10;
5 int n, m;
6 int fa[N], c[N], a[N], rt[N];
7 ll h[N], v[N], s[N];
8 int ls[N], rs[N], dep[N];
9 int Dep[N], die[N], ans[N];
10 ll add[N], tim[N];//+ *
11
12 void pushdown(int x) {//下传标记
13 if (add[x] == 0 && tim[x] == 1) return;
14 if (ls[x]) {
15 tim[ls[x]] *= tim[x];
16 add[ls[x]] *= tim[x];
17 add[ls[x]] += add[x];
18 s[ls[x]] *= tim[x];
19 s[ls[x]] += add[x];
20 }//先处理乘再处理加
21 if (rs[x]) {
22 tim[rs[x]] *= tim[x];
23 add[rs[x]] *= tim[x];
24 add[rs[x]] += add[x];
25 s[rs[x]] *= tim[x];
26 s[rs[x]] += add[x];
27 }
28 add[x] = 0, tim[x] = 1; //恢复标记
29 }
30
31 int merge(int x, int y) {
32 if (!x || !y) return x + y;
33 pushdown(x), pushdown(y);
34 if (s[x] > s[y]) swap(x, y);//小根堆
35 rs[x] = merge(rs[x], y);//x的右节点与y合并
36 if (dep[ls[x]] < dep[rs[x]]) swap(ls[x], rs[x]);//维护左偏性质
37 dep[x] = dep[rs[x]] + 1;
38 return x;
39 }
40
41 int main() {
42 scanf("%d %d", &n, &m);
43 for (int i = 1; i <= n; i++) {
44 scanf("%lld", &h[i]);//城池防御力
45 rt[i] = -1;//设为空
46 }
47 Dep[1] = 1, dep[0] = -1;
48 for (int i = 2; i <= n; i++) {
49 scanf("%d %d %lld", &fa[i], &a[i], &v[i]);//父亲 城池能力改变方式 城池能力改变值
50 Dep[i] = Dep[fa[i]] + 1;
51 }
52 for (int i = 1; i <= m; i++) {
53 scanf("%lld %d", &s[i], &c[i]);//骑士能力 出生地
54 tim[i] = 1;
55 if (rt[c[i]] == -1) rt[c[i]] = i;
56 else rt[c[i]] = merge(rt[c[i]], i);//合并同城骑士
57 }
58 for (int i = n; i >= 1; i--) {//从下到上
59 while (rt[i] != -1) {//当前堆不为空
60 if (s[rt[i]] < h[i]) {
61 die[rt[i]] = i;//死亡
62 pushdown(rt[i]);
63 if (!ls[rt[i]]) rt[i] = -1;
64 else rt[i] = merge(ls[rt[i]], rs[rt[i]]);
65 }
66 else break;//剩下的不死
67 }
68 if (i == 1) break;//特判根节点
69 if (rt[i] == -1) continue;
70 if (a[i]) tim[rt[i]] *= v[i], add[rt[i]] *= v[i], s[rt[i]] *= v[i];
71 else add[rt[i]] += v[i], s[rt[i]] += v[i];
72 pushdown(rt[i]);
73 if (rt[fa[i]] == -1) rt[fa[i]] = rt[i];
74 else rt[fa[i]] = merge(rt[fa[i]], rt[i]);//幸存骑士到父节点
75 }
76 for (int i = 1; i <= m; i++) ans[die[i]]++;
77 for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
78 for (int i = 1; i <= m; i++) printf("%d\n", Dep[c[i]] - Dep[die[i]]);
79 return 0;
80 }
81 /*
82 1.注意tim 初始化为1
83 2.dep[0] = -1 ***** 左偏树中空节点距离要设为-1
84 3.注意处理标记
85 4.特判骑士死光的情况(MLE)
86 */
P3261 [JLOI2015]城池攻占 (左偏树+标记下传)的更多相关文章
- [luogu3261 JLOI2015] 城池攻占 (左偏树+标记)
传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的 ...
- [洛谷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 ...
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- [BZOJ4003][JLOI2015]城池攻占(左偏树)
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...
- bzoj 4003 [JLOI2015]城池攻占 —— 左偏树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...
- bzoj 4003: 城池攻占 左偏树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...
随机推荐
- 基于python3.7利用Motor来异步读写Mongodb提高效率
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_111 如果使用Python做大型海量数据批量任务时,并且backend用mongodb做数据储存时,常常面临大量读写数据库的情况. ...
- C#里如何简单的校验时间格式
前言: 晚上打算睡觉的时候,群里反馈订单接收失败,开工排查问题,日志显示验签失败,发现一个蛮有意思的BUG,总算有了一个写作的素材 场景描述 本次的场景属于比较常见的收单API,对第三方的订单进行签名 ...
- Apache DolphinScheduler新一代分布式工作流任务调度平台实战-中
@ 目录 架构设计 总体架构 启动流程图 架构设计思想简述 负载均衡 缓存 实战使用 参数 参数优先级 内置参数 基础内置参数 衍生内置参数 本地参数和全局参数 工作流传参 数据源管理 支持数据源 创 ...
- 用JavaScript写随机出一个颜色
function changeColor(){ var r = parseInt(Math.random()*255) var g = parseInt(Math.random()*255) var ...
- 使用.NET简单实现一个Redis的高性能克隆版(七-完结)
译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单.高性能兼容Redis协议的数据库的经历. 首先这个"Redis"是非常简单的实现,但是他 ...
- Apache DolphinScheduler 使用文档(4/8):软件部署
本文章经授权转载,原文链接: https://blog.csdn.net/MiaoSO/article/details/104770720 目录 4. 软件部署 4.1 为 dolphinschedu ...
- 使用 Golang 代码生成图表的开源库对比
本文的目标读者 对用 Golang 代码生成折线图.扇形图等图表有兴趣的朋友. 本文摘要 主要介绍 Go 中用以绘图的开源库,分别是: GitHub - wcharczuk/go-chart: go ...
- Spring 05: 用DI(依赖注入)优化Spring接管下的三层项目架构
背景 用注解改造前面Spring博客集里(指 Spring 02)Spring接管下的三层项目架构 对前面Spring博客集里(指 Spring 04)@Controller + @Service + ...
- P7727 风暴之眼 Eye of the Storm (树形 DP)
谨 以 此 文 表 达 笔 者 个 人 观 点 , 如 有 冒 犯 官 解 , 可 在 评 论 区 诉 说 _{^{_{谨以此文表达笔者个人观点,如有冒犯官解,可在评论区诉说}}} 谨以此文表达笔者个 ...
- Html飞机大战(九): 使徒来袭 (设计敌机)
好家伙,本篇介绍敌机 好了,按照惯例我们来理一下思路: 我们有一个敌机类,第一步当然是实例一个敌机对象, 然后我们把这个敌机放入我们的敌机群(敌机数组) 然后是熟悉的移动和绘制 那我们回顾一下 ...