[题解]P4597 序列 sequence

news/2024/10/15 6:18:22

P4597 序列 sequence
是CF13C Sequence的加强版,\(N\leq 5*10^5\)

如果想了解\(O(N^2)\)的DP解法请看此文。


给定\(N\)个数,每次操作可以选其中一个数\(+1\)\(-1\)。请问要让这个数列不降,最少需要多少次操作?

看到数据范围发现不能用\(O(N^2)\)的dp了,需要换一种思路。

我们用类似贪心的方法做,从左往右找\(i<j,a_i>a_j\)(注意\(i,j\)不一定连续,后面就懂了),然后对它们的值进行上调下调。

如上图,我们发现\(10\to 1\)不满足“不降”,需要进行调整。我们想到在\([1,10]\)中找到一个中间点,把这\(2\)个数都移动到中间点。而无论中间点是几,这一操作代价都为\(10-1=9\)。那么我们为了让操作次数尽可能小,我们应该尽可能让中间点往下,即移动到\(1\)

总结:如果遇到\(x\)\(y\)后面,而\(x>y\),我们需要把\(y\)下移到\(x\)的位置。从左到右遍历每条边,重复上述操作即可。

大家可能会有疑惑:如果\(y\)前面的\(z\),满足\(x<z<y\),如果把\(y\)下移到\(x\),就会破坏前面的“不降”:

  • 如果\(z\)后面又遇到一个值\(a_i<a_{i-1}\),而它之前的最小值正是\(z\),它就会把\(z\)压下去。
    但如下图,我们又发现,\(z\)下调后,后边又不满足不降,此时就把\(x\)作为\(z\)循环上面的步骤。

  • 如果\(z\)后面没有更低的值,则说明\(y\)没必要降到\(x\),中间点可以上移到\(z\)也不会影响结果,但在此同时我们让原序列合法了。而中间点只要在\([x,y]\)中间,消耗就相同,所以答案不受影响。

综上,答案不会受下移的影响,尽管序列可能不满足“不降”,但我们可以在消耗不变的情况下调整至满足条件。


接下来就是代码实现。为了维护前面的最大值,我们开一个优先队列。
对于输入的每一个\(x\)
首先加入\(x\)
如果遇到\(x<max\),则\(ans+=max-x\),然后\(max\)出队列,加入下调后的高度\(x\)

时间复杂度\(O(N\log N)\)

虽然加强版空间限制从64MB提升到了125MB,但是这份代码可以过CF的原题,因为空间消耗只有\(\log N\)而已。

注意开long long

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
priority_queue<int> q;
int n,x,ans;
signed main(){cin>>n;while(n--){cin>>x;q.push(x);if(x<q.top()){ans+=q.top()-x;q.pop();q.push(x);}}cout<<ans;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

关于雨滴谱数据的处理

粒径的取值范围为:0.31~8mm 因此excel中标记红色的都需要删除: txt文件为(红框为留下来的数据),一共五组数,也就是五个时间的数: 那么我只留下我需要的d的n的数据,删除不需要的列:# -*- coding:utf-8 -*- """ @author: su @file: deletlie.py @time: 2…

1.验整码的发送与检验

通过restTemplate.exchage()来发送验证码,需要4个参数,url,请求方式,请求内容,需要相应类型) 响应的结果为map结合,我们需要取出key值,用俩次map取值可以取出key 检验验证 需要输入验证码和key restTeMPLATE.exhcange(url,....);//发送请求获得验证码 请求内容为空 判断…

如何在本地局域网中通过SMB协议加密共享文件

Windows网络发现共享是Windows操作系统中的一个功能,通过该功能,用户可以在局域网内自动发现和访问其他计算机上共享的资源,如文件夹、打印机等。这个功能通常使用SMB(Server Message Block)协议来实现文件共享和网络资源访问。V1.0 于2024年5月1日发布于博客园序言Window…

二值信号量和计数信号量

信号量常用于控制对共享资源的访问和任务同步。 其中控制共享资源可以从停车场的例子去理解。比如现在这个停车场最大容量为100。这个100就是共享资源。假如要把车停进去这个停车场,就需要查看当前停车场中的数量。当前的停车数量就是信号量。信号量的增加对应停车场的车开出停…

ROS2官方文档阅读笔记:Managed nodes

原文 目录Managed nodesstatetransition Managed nodes 这篇文章讲解了节点的生命周期蓝色方块里的被称为Primary State,即基本状态 黄色方块里的被称为transition,即转换 state 在这里总结一下的节点的各个状态: 1.一旦节点被实例化,则到达unconfigured的状态 2.经过转换(…

一次IO性能问题的发现过程

一次IO性能问题的发现过程背景 计划搭建两套完全的系统进行压测. 但是发现自己给自己挖了一个坑, 没注意到一个区别. 邮件在三点钟发出去了, 但是问题是我在四点钟发现的.问题现象 阿里云上面高一个虚拟机 的CPU出现异常的 CPU用量上升的问题. Busy IOwait 比较高. 有 60% 感觉…

在静态网络环境中快速修改网络配置信息的解决方案

当网络配置设置为静态IP时,切换不同的位置意味着要不断的修改IP配置信息,每次修改都较为麻烦V1.0 2024年5月1日发布于博客园序言 当网络配置设置为静态IP时,切换不同的位置意味着要不断的修改IP配置信息,每次修改都较为麻烦,在试过多种方案后,找到了“ IPNetSetManPro ”…

开源IDS/IPS Suricata的部署与使用

Suricata 是一个高性能的网络入侵检测和防御系统(IDS/IPS)。它是由OISF开发,完全开源,并且可以免费使用。目录前言在Linux上部署SuricataSuricata的基本配置配置文件Suricata的规则Suricata的使用Suricata检测SQL注入 前言 Suricata 是一个高性能的网络入侵检测和防御系统(…