【洛谷】【堆+结论】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\),使得这两个序列相应位置之差的平方和最小,并输出这个最小 ...
随机推荐
- 微信小程序学习资料整理
基础篇 官网: https://mp.weixin.qq.com/cgi-bin/wx 微信小程序: 小程序是一种新的开放能力,开发者可以快速地开发一个小程序.小程序可以在微信内被便捷地获取和传播,同 ...
- THINK PHP 学习笔记20171115
Part1:框架目录project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ├─index 模块目录(可更改) │ │ ├─co ...
- Spring系列之——Spring事务以及两大核心IOC和AOP
1 Spring事务 1.1 Spring事务是什么(百度) 事务是对一系列的数据库操作(比如插入多条数据)进行统一的提交或是回滚操作,如果插入成功,那么一起成功,如果中间一条出现异常,那么回滚之前的 ...
- hdu 4090
GemAnd Prince Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 高并发第八弹:J.U.C起航(java.util.concurrent)
java.util.concurrent是JDK自带的一个并发的包主要分为以下5部分: 并发工具类(tools) 显示锁(locks) 原子变量类(aotmic) 并发集合(collections) ...
- linux 上传下载 以及SCP命令
1. scp 用法 scp就是用来在服务器和本地之间传文件的linux命令还有其他的方法,比如装ftp服务器 copy 本地的档案到远程的机器上 scp /Desktop/test.conf 用户名@ ...
- vue-cli脚手架的安装
https://github.com/vuejs/vue-cli 官网 使用官方推荐的webpack 条件:node在4.以上,npm在3以上,查看版本号打开cmd输入,node -v npm ...
- less之旅
在遇到less之前,一直和css交往,当less出现在我码农生涯的时候,被她给深深地吸引.从此,less成了自己码农生活里面的一房,css退居二房!那么,less到底有什么魅力让我如此迷上她呢? le ...
- the interconversion of String and StringBuilder
package com.itheima_03; /* * StringBuilder和String的相互转换 * * StringBuilder -- String * public String t ...
- Android设置日期DatePickerDialog
设置日期DatePickerDialog package com.example.testview; import java.util.Calendar; import java.util.Date; ...