【洛谷】【堆+结论】P4597 序列sequence
【题目背景:】
原题cf13c 数据加强版(就是说原来能用DP做现在不行了QwQ)
【题目描述:】
给定一个序列,每次操作可以把某个数+1-1。要求把序列变成非降数列。而且要求修改后的数列只能出现修改前的数。
【输入格式:】
第一行输入一个n,表示有n( n \leq 5*10^5n≤5∗105 )个数字。第二行输入n个整数,整数的绝对值不超过 10^9109
【输出格式:】
输出一个数,表示最少的操作次数
【算法分析:】
切题背景:
chen_zhe大佬改编了这道题目之后吸引了slyz准高一全机房同学的注意
主要是一开始是道紫题想要通过以后强行把它变黑(雾
然后全机房的同学刚了一节课4597无果(中间它突然变成了黑题QwQ)
然后就被隔壁机房的学长学姐拯救了...
对于一个序列,可以看成高度不同的几根线
如:序列{3、 4、 1、 5}可以看做这样
----
----
---- ----
3 4 1 5
对于一个大数a和一个小数b,要做的就是在他们之间的任意位置找到一个基准,将大数向下挪到那个基准,小数向上挪到那个基准
移动的距离等价于a - b
由于是非降序列,将a向下移动的距离越多越可以使之后的数字更容易变成非降序列
所以这个基准应该是选择之前的最大数c,
当之前的最大数在[a, b]这个区间内,将a向下移到c并将b向上移到c的距离等价于将a向下移动到b的距离
所以就把a移到b就好了
而由于之前已经有一个c值,不把a,b移动到c也能保证之后答案的正确性
而当之后如果有许多个小数的时候,这么做也能保证之后答案的正确性,因为当前的c和当前b在这种情况里应该是同属于[之后的a, 之后的b]的区间内
当之前的最大数比b还要小的时候,b就变成了之前非降序列的一部分,a - b相当于将a向下移动到b
由于c是之前的最大数(也就是说现在的a > c),所以不存在c比a大的情况
然后开个大根堆瞎搞:
对于读进的一个数num,把它push到优先队列里去
如果这个num比之前的最大值maxn(就是堆顶元素)要小的话
ans += maxn - num
并把maxn弹出,再push进一个num(把maxn移动到了num的位置,这个操作正确性的证明见上面)
【代码:】
//序列sequence加强版
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; int n;
long long ans;
priority_queue<int> q; inline int read() {
int x = , f = ; char ch = getchar();
while(ch < '' || ch > '') { if(ch == '-') f = -; ch = getchar(); }
while(ch >= '' && ch <= '')
x = (x << ) + (x << ) + ch - , ch = getchar();
return x * f;
} int main() {
n = read();
for(int i = ; i <= n; i++) {
int num = read();
q.push(num);
if(num < q.top()) {
ans += q.top() - num;
q.pop();
q.push(num);
}
}
printf("%lld\n", ans);
}
【洛谷】【堆+结论】P4597 序列sequence的更多相关文章
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
- 【洛谷3321_BZOJ3992】[SDOI2015]序列统计(原根_多项式)
题目: 洛谷3321 分析: 一个转化思路比较神(典型?)的题-- 一个比较显然的\(O(n^3)\)暴力是用\(f[i][j]\)表示选了\(i\)个数,当前积在模\(m\)意义下为\(j\)的方案 ...
- 【洛谷5294】[HNOI2019] 序列(主席树维护单调栈+二分)
点此看题面 大致题意: 给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小 ...
随机推荐
- Caused by: org.hibernate.HibernateException: identifier of an instance of ... is alterde from
Caused by: org.hibernate.HibernateException: identifier of an instance of ... is alterde from Hi ...
- 【redis中键的生存时间(expire) 】
1.redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它 expire 设置生存时间(单位/秒) pexpire 设置生存时间( ...
- SSM(Spring+SpringMVC+Mybstis)搭建,写给新手
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis) 作用: SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为 ...
- Mac下 KGDB连接Linux
kgdb按照资料说可以使用网络(kgdboe)和串口连接(kgdboc)等方式连接. 这里使用后者,资料比较多,下面是自己在Mac上进行配置连接的过程. 先说一下环境: 主机:Mac OSX 10.1 ...
- egg.js-基于koa2的node.js入门
一.Egg.JS 简介 Egg.JS是阿里开发的一套node.JS的框架,主要以下几个特点: Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景 ...
- MySQL的索引与优化
写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...
- zookeeper应用 - 监控
服务器端:监听zk上父节点的子节点变化 package monitor; import java.util.List; import java.util.concurrent.CountDownLat ...
- windows 命令行报错:file(s) not in client view
今天在执行p4 sync命令时报错:File(s) not in client view,查找后发现其实是未连接上p4服务器.需要重新设置P4PORT=服务器地址 即可解决(参考链接:https:/ ...
- Axure中移动端原型设计方法(附IPhoneX和IPhone8最新模板)
Axure中移动端原型设计方法(附IPhoneX和IPhone8最新模板) 2018年4月16日luodonggan Axure中基于设备模板的移动端原型设计方法(附IPhoneX和IPhone8最新 ...
- Linux系统管理员命令:sudo
sudo是个统管一切的命令.它的字面意思是代表“超级用户才能做!”(super user do!)对Linux系统管理员或高级用户而言,它是必不可少的最重要的命令之一.你可曾有过这样的经历:在终端中试 ...