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

Description

小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池。这 n 个城池用 1 到 n 的整数表示。除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i。也就是说,所有城池构成了一棵有根树。这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci。

每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池;否则占领失败,骑士将在这座城池牺牲。占领一个城池以后,骑士的战斗力将发生变化,然后继续攻击管辖这座城池的城池,直到占领 1 号城池,或牺牲为止。

除 1 号城池外,每个城池 i 会给出一个战斗力变化参数 ai;vi。若 ai =0,攻占城池 i 以后骑士战斗力会增加 vi;若 ai =1,攻占城池 i 以后,战斗力会乘以 vi。注意每个骑士是单独计算的。也就是说一个骑士攻击一座城池,不管结果如何,均不会影响其他骑士攻击这座城池的结果。如果 \(a_i~=~1\),保证 \(v_i~>~0\)

现在的问题是,对于每个城池,输出有多少个骑士在这里牺牲;对于每个骑士,输出他攻占的城池数量。

Limitation

\(1~\leq~n,~m~\leq~3~\times~10^5\)

Solution

最近沉迷颓废学习很久没写博客了啊QAQ

考虑由于若在一个位置的战斗力是乘法则只会乘正整数,当同一个节点的骑士向上攻占的时候,他们相互之间战斗力的大小关系是不变的。如果我们维护每个节点上还剩下了多少骑士,那么每到一个节点所有小于某个值的元素都要被删除,这提示我们使用堆来维护。由于需要支持信息的合并,我们考虑使用左偏树来完成。

考虑到达一个节点以后会给节点里所有的元素做一次修改,但是这个修改是不影响堆的结构的,于是可以在堆的根节点上打标记,不断下方即可。

Code

#include <cstdio>
#include <vector>
#include <algorithm>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#endiftypedef long long ll;namespace IPT {const int L = 1000000;char buf[L], *front=buf, *end=buf;char GetChar() {if (front == end) {end = buf + fread(front = buf, 1, L, stdin);if (front == end) return -1;}return *(front++);}
}template <typename T>
inline void qr(T &x) {char ch = IPT::GetChar(), lst = ' ';while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();if (lst == '-') x = -x;
}namespace OPT {char buf[120];
}template <typename T>
inline void qw(T x, const char aft, const bool pt) {if (x < 0) {x = -x, putchar('-');}int top=0;do {OPT::buf[++top] = static_cast<char>(x % 10 + '0');} while (x /= 10);while (top) putchar(OPT::buf[top--]);if (pt) putchar(aft);
}const int maxn = 300010;struct Kni {ll s;int c, ans;
};
Kni kt[maxn];struct Tree {Kni* v;ll addv, addm, dist;Tree *ls, *rs;Tree(Kni *_v = NULL) {ls = rs = NULL;dist = addv = 0; addm = 1;v = _v;}inline void addtag(ll x) {this->addv += x;this->v->s += x;}inline void multag(ll x) {this->addm *= x;this->addv *= x;this->v->s *= x;}inline void pd(ll x, ll y) {this->multag(y); this->addtag(x); }inline void pushdown() {if (this->ls) this->ls->pd(this->addv, this->addm);if (this->rs) this->rs->pd(this->addv, this->addm);this->addv = 0; this->addm = 1;}inline void pushup() {this->dist = (this->rs ? this->rs->dist : 0) + 1;}
};
Tree *tree[maxn];int n, m;
int fa[maxn], depth[maxn], died[maxn];
ll MU[maxn], a[maxn], v[maxn]; 
std::vector<int>son[maxn], kts[maxn];void dfs(int);
Tree *merge(Tree*, Tree*);int main() {freopen("1.in", "r", stdin);qr(n); qr(m);for (int i = 1; i <= n; ++i) qr(MU[i]);for (int i = 2; i <= n; ++i) {qr(fa[i]); son[fa[i]].push_back(i); qr(a[i]); qr(v[i]);}for (int i = 1; i <= m; ++i) {qr(kt[i].s); qr(kt[i].c); kt[i].ans = -1;kts[kt[i].c].push_back(i);}dfs(1);for (int i = 1; i <= n; ++i) qw(died[i], '\n', true);for (int i = 1; i <= m; ++i) qw(~kt[i].ans ? kt[i].ans : depth[kt[i].c], '\n', true);return 0;
}Tree *merge(Tree *u, Tree *v) {if (!u) return v;if (!v) return u;u->pushdown(); v->pushdown();if (u->v->s > v->v->s) std::swap(u, v);u->rs = merge(u->rs, v);if ((u->rs) && ((!u->ls) || (u->rs->dist > u->ls->dist))) std::swap(u->ls, u->rs);u->pushup();return u;
}void dfs(int u) {depth[u] = depth[fa[u]] + 1;for (auto to : son[u]) {dfs(to);while (tree[to] && (tree[to]->v->s < MU[u])) {++died[u];tree[to]->v->ans = depth[tree[to]->v->c] - depth[u];tree[to]->pushdown();tree[to] = merge(tree[to]->ls, tree[to]->rs);}tree[u] = merge(tree[u], tree[to]);}for (auto i : kts[u]) {if (kt[i].s >= MU[u]) tree[u] = merge(tree[u], new Tree(&kt[i]));else {++died[u];kt[i].ans = 0;}}if (!tree[u]) return;if (a[u]) tree[u]->multag(v[u]);else tree[u]->addtag(v[u]);
}

Summary

只要信息修改后不影响堆的形态,可以在左偏树上打标记来完成修改。

转载于:https://www.cnblogs.com/yifusuyi/p/10539753.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【原创】数据库中为什么不推荐使用外键约束

引言 其实这个话题是老生常谈&#xff0c;很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条 【强制】不得使用外键与级联&#xff0c;一切外键概念必须在应用层解决。 但是呢&#xff0c;询问他们原因&#xff0c;大多是这么回答的 每次做DELETE 或者…

初识Activiti

http://wenku.baidu.com/view/bb7364ad4693daef5ff73d32.html 1. 初识Activiti 1.1. 工作流与工作流引擎 工作流&#xff08;workflow&#xff09;就是工作流程的计算模型&#xff0c;即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其…

开源软件 安全风险_3开源安全风险及其解决方法

开源软件 安全风险Open source software is very popular and makes up a significant portion of business applications. According to Synopsys, 99% of commercial databases contain at least one open source component, and nearly 75% of these codebases contain open…

React-Router 源码分析1

1、单页面应用的路由基本原理 demo1 router1.html 复制代码以 hash 形式为例。 1、init 监听浏览器 url hash 更新事件。 2、route 存储路由更新时的回调到回调数组routes中&#xff0c;回调函数将负责对页面的更新。 3、refresh 执行当前url对应的回调函数&#xff0c;更新页面…

linux安装日志切割程序

linux安装日志切割程序 安装 gcc&#xff08;1&#xff09; yum insatll gcc &#xff08;2&#xff09;# cd cronolog-1.6.2 4、运行安装 # ./configure# make# make install 5、查看cronolog安装后所在目录&#xff08;验证安装是否成功&#xff09; # which cronolog 一般情…

自助分析_为什么自助服务分析真的不是一回事

自助分析That title probably got your attention and now you think I have some explaining to do! The key word in the title is the word “A”. Self-service analytics isn’t a thing if “a thing” means a single, distinct corporate initiative or set of require…

BPMN2.0-概要

BPMN2.0-概要 作者&#xff1a;AliKevin2011&#xff0c;发布于2012-6-27 一、BPMN简介 BPMN&#xff08;Business Process Model And Notation&#xff09;- 业务流程模型和符号 是有BPMI&#xff08;Business Process Management Initiative&#xff09;开发的一套变准的业务…

如何用Phaser实现一个全家福拼图H5

一、Phaser介绍 二、整体框架搭建 三、资源加载 四、游戏逻辑五、完成六、总结参考文档 最近用Phaser做了一个全家福拼图h5的项目&#xff0c;这篇文章将会从零开始讲解如何用Phaser实现&#xff0c;最终效果如下&#xff1a; 源码&#xff1a;https://github.com/ZENGzoe/phas…

angularjs 默认跳转

angularjs 的 $state.go() 跳转页面 &#xff0c;目标页面的js函数 的执行 先于 $locationChangeStart 的监听函数。 故意 添加 timeout 可以使 controller 在locationchangestart 之后触发。转载于:https://www.cnblogs.com/RoadAspenBK/p/9923332.html

错误录入 算法_如何使用验证错误率确定算法输出之间的关系

错误录入 算法Monument (www.monument.ai) enables you to quickly apply algorithms to data in a no-code interface. But, after you drag the algorithms onto data to generate predictions, you need to decide which algorithm or combination of algorithms is most re…

Activiti 简易教程

一搭建环境 1.1 JDK 6 activiti 运行在版本 6以上的 JDK上。转到 Oracle Java SE下载页面&#xff0c;点击按钮“下载 JDK”。网页中也有安装说明。要核实安装是否成功&#xff0c;在命令行上运行 java–version。将打印出安装的 JDK的版本。 1.2 Ant 1.8.1 从 Ant[http://…

xargs命令详解,xargs与管道的区别

在工作中经常会接触到xargs命令&#xff0c;特别是在别人写的脚本里面也经常会遇到&#xff0c;但是却很容易与管道搞混淆&#xff0c;本篇会详细讲解到底什么是xargs命令&#xff0c;为什么要用xargs命令以及与管道的区别。为什么要用xargs呢&#xff0c;我们知道&#xff0c;…

pytorch回归_PyTorch:用岭回归检查泰坦尼克号下沉

pytorch回归In this notebook, we shall use this dataset containing data about passengers from the Titanic. Based on this data, we will use a Ridge Regression model which just means a Logistic Regression model that uses L2 Regularization for predicting wheth…

Java后台与VUE跨域交接

后台代码&#xff1a;package com.cn.Mr.Zhong.filter;import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;impor…

koa2 中使用 svg-captcha 生成验证码

1. 安装svg-captcha $ npm install --save svg-captcha 2. 使用方法 生成有4个字符的图片和字符串const svgCaptcha require(svg-captcha)const cap svgCaptcha.create({size: 4, // 验证码长度width:160,height:60,fontSize: 50,ignoreChars: 0oO1ilI, // 验证码字符中排除 …

Weblogic 节点启动

1.启动管理理节点export JAVA_OPTIONS"$JAVA_OPTIONS -Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID1.0 -Djava.security.egdfile:/dev/./urandom"nohup ./startWebLogic.sh >admin.log &tail -f admin.log2.启动节点ssonohup ./startManaged…

[Swift]LeetCode74. 搜索二维矩阵 | Search a 2D Matrix

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

iris数据集 测试集_IRIS数据集的探索性数据分析

iris数据集 测试集Let’s explore one of the simplest datasets, The IRIS Dataset which basically is a data about three species of a Flower type in form of its sepal length, sepal width, petal length, and petal width. The data set consists of 50 samples from …

Oracle 12c 安装 Linuxx86_64

1)下载Oracle Database 12cRelease 1安装介质 官方的下载地址&#xff1a; 1&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2&#xff1a;https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number16496…

Linux入门实验

学习Linux要先做实验来熟悉操作系统本次先写点入门的操作。 关于Linux入门实验的操作如下&#xff1a; 【例1】显示当前使用的shell [rootcentos7 ~]# echo ${SHELL} /bin/bash 【例2】显示当前系统使用的所有shell [rootcentos7 ~]#cat /etc/shells /bin/sh /bin/bash /usr/bi…