[题解]P4597 序列 sequence
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\)。
总结:如果遇到\(y\)前面的最大值\(x\),满足\(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的原题,因为空间消耗只有\(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;
}
[题解]P4597 序列 sequence的更多相关文章
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 【洛谷】【堆+结论】P4597 序列sequence
[题目背景:] 原题cf13c 数据加强版(就是说原来能用DP做现在不行了QwQ) [题目描述:] 给定一个序列,每次操作可以把某个数+1-1.要求把序列变成非降数列.而且要求修改后的数列只能出现修改 ...
- P4597 序列sequence
传送门 题解 完全看不懂大佬们在说什么……特别是chen_zhe大佬写的…… 来说说个人的理解吧 大佬们说:考虑当前的数$x$和之前的最大数$y$,(默认$x<y$,因为如果$x>=y$已 ...
- Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...
- Oracle序列(Sequence)创建、使用、修改、删除
Oracle对象课程:序列(Sequence)创建.使用.修改.删除,序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成.创建序 ...
- 序列sequence中的cache问题
Oracle中序列Sequence的创建语法如下: CREATE SEQUENCE [ schema. ] sequence [ { INCREMENT BY | START WITH } integ ...
- oracle数据库--序列(sequence)
一个问题: 在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的增长,怎么处理? 解决方式:oracle是利用"序列"(sequence)来完成的. ...
- Oracle数据库中序列(SEQUENCE)的用法详解
Oracle数据库中序列(SEQUENCE)的用法详解 在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...
- Oracle 序列(sequence)
序列(sequence) 是Oracle提供的用于生成一系列唯一数字的数据库对象.它会自动生成顺序递增或者递减的序列号,以实现自动提供唯一的主键值.序列可以在多用户并发环境中使用,并且可以为所有用户生 ...
- oracle 序列sequence
查询所有的序列: select 'create sequence '||sequence_name|| ' minvalue '||min_value|| ' maxvalue '||max_valu ...
随机推荐
- Golang相关环境变量
GOROOT: GO语言的安装路径,linux系统下一般是/usr/local/go GOPATH: 程序员自己的go源码路径,比如开发一个Helloworld的项目,那么它的代码文件夹就应该放在GO ...
- 【mklink】创建符号链接
场景 我通常用这个指令将C盘的文件转移到D盘中,或者是把一定要安装在C盘的软件所占用的空间转移到D盘.但是常常不记得参数和顺序. 指令通用格式 C盘的文件转移到D盘中 假设要把C:\abc\这个文件夹 ...
- 启智树提高组day4T1 T1(t1.cpp,1s,512MB)
启智树提高组day4T1 T1(t1.cpp,1s,512MB) 题面描述 对⼀个⻓度为2n 的实数序列A考虑下列问题: 设S为序列中所有元素的和.你可以做下列操作n次: 选择两个未被选中过的下标i和 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(5)
1.问题描述: 集成华为一键登录的LoginWithHuaweiIDButton, 但是Button默认名字叫 "华为账号一键登录",太长无法显示,能否简写成"一键登录& ...
- LLM 输出配置 (LLM output configuration)
1.概述 大型语言模型(LLM)的输出行为可以通过多种配置参数进行精细控制.这些参数共同决定了模型生成文本的质量.风格和多样性.理解这些配置选项及其相互作用对于有效使用LLM至关重要. 2.输出长度 ...
- 【干货分享】手把手教你实现AI应用对话批量自动化测试(含源码)
一.场景说明 MaxKB对话应用在发布之后,可以使用本文提供的Python自动化测试脚本,快速验证对话应用的响应结果,响应时间,引用分段,消耗tokens数量等关键指标.请查看MaxKB-API.zi ...
- 树结构Tree
树结构 平衡顺序二叉树 通过平衡顺序二叉树查数据的时候,也就等同于二分查找的操作 Binary Search 2,3树 二三树 二三树有 node2 和 node3 两种节点,树的规则如图 2-3-4 ...
- AI生成的一篇官网代码,有兴趣可以参考一下
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...
- 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅?
title: 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅? date: 2025/06/18 10:11:53 updated: 2025/06/18 10:11:53 author: ...
- About me and the blog
About me and the blog About me 坐标\(CQ\),可以叫我\(Luoyu\)/洛雨/呆猫(似乎混入了奇怪的东西,时常模仿呆猫说话故而得名)/猫老大(???不知道啥时候下一 ...