博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5059 前鬼后鬼的守护 【堆扩展】*
阅读量:5263 次
发布时间:2019-06-14

本文共 1272 字,大约阅读时间需要 4 分钟。

BZOJ5059 前鬼后鬼的守护


Description

八云紫的式神八云蓝有一张符卡名为[式神-前鬼后鬼的守护],这张符卡的弹幕为BOSS从两侧向自机发射大玉,大玉后面跟着一些小玉,形成一个“V”字型的弹幕。然鹅兰大人觉得这个弹幕还能再美观一些,她想让自己的弹幕能从左向右发射,于是她就开始了行动。

[式神-前鬼后鬼的守护]由 N波弹幕组成,每波弹幕都有一个落到板底的位置,第i波弹幕的落地位置为Xi。
为了让弹幕能从左到右落地,蓝妈需要改变一些弹幕的落地位置,使得改变后的落地位置的坐标不递减,即
这里写图片描述
。然鹅改变弹幕的方向是很累的,蓝妈每将一波弹幕的坐标增加或减少1,就会花费一单位的能量,即
这里写图片描述
蓝妈想确定一个最终的修改方案使得他花费的能量最少,于是她将设计修改方案的任务交给了自己的式神八云橙。
这可急坏了我们的橙喵,她只是连曼哈顿距离都不会算的年幼式神,你能帮助她完成这个任务吗?

Input

输入文件第一行为一个正整数N ,意义如题目所示。接下来一行N个正整数,第i个整数代表Xi 。

N<=5*10^5,Xi<=10^9

Output

输出一个整数,为最小消耗的能量值。

Sample Input

7

1 3 2 4 5 3 9

Sample Output

3

将第二波弹幕的落地位置由3改为2 ,花费为1 ,将第六波由3 改为5 ,花费为2 ,总花费为1+2=3 ,形成了一个不下降序列:1,2,2,4,5,5,9为最优解(不一定为唯一最优解)


BZOJ上最短的代码就这样贴出来了

首先我们考虑已经维护好的一个区间

这里写图片描述
我们考虑新加入一个小于最大值的点(大于最大值直接加入)
就像这样
这里写图片描述

我们可以花费abs(valmaxvalA)abs(valmax−valA)的代价把A和max变成这区间中的任意一个数,所以也就实现了维护

所以我们其实就相当于是把max变成了A,并付出了abs(valmaxvalA)abs(valmax−valA)的代价
这样之后我们又可以从当前的max开始维护
这样举个栗子:
这里写图片描述
新加入的点小于原来的A怎么办?雾
我们可以用abs(valmax(C)valH)abs(valmax(C)−valH)的代价把C和H变成这区间中的任意一个数,在这里我们可以直接将就上一次剩下的A,其实也不影响,所以C和H又相当于变成了两个H
这里写图片描述
可以证明一定是可以有一种方式使得单调不减

然后就写一段小小的代码

非常方便快捷


#include
using namespace std;priority_queue
q;int n,x;long long ans=0;int main(){ scanf("%d",&n); while(n--){ scanf("%d",&x); q.push(x); if(x

转载于:https://www.cnblogs.com/dream-maker-yk/p/9676295.html

你可能感兴趣的文章
electron入门心得
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>
我的Hook学习笔记
查看>>
js中的try/catch
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
简述spring中常有的几种advice?
查看>>
整理推荐的CSS属性书写顺序
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>