P4597 序列sequence
题解
完全看不懂大佬们在说什么……特别是chen_zhe大佬写的……
来说说个人的理解吧
大佬们说:考虑当前的数$x$和之前的最大数$y$,(默认$x<y$,因为如果$x>=y$已经满足非降了)为了让它非降,我们要在区间$[x,y]$里找到一个数$z$,使$y$减小到$z$,$x$增大到$z$,那么可以发现,不管取的数是什么,代价都是$y-x$
不难看出,$y$减小的越多,后面的序列越容易变成非降,那么只要让$y$减小到$x$就好了
看到这里,我一直有一个疑问,如果令$y$减小到$x$之后,序列不满足非降了怎么办?
仔细想了想,实际上应该是这样的:为了让序列非降,$y$不能小于$y$之前的最大值。而由于$y$是整个序列的最大值,如果它之前的最大值$z$小于等于$x$,那么将$y$减小到$x$仍能保证序列是非降的。否则的话,$z$大于$x$小于$y$,仍是在区间$[x,y]$内,那么移动的代价是$y-x$,所以用于更新答案是没有问题的
那么这里为什么要让$y$减到最小呢?这是因为$x$和$y$不论如何调整,他们的代价之和都已经不变了,但问题是他们目前选的最优方案并不是之后的最优。为了满足他们在之后最优,只有把$y$减小到$x$,才能保证之后更有可能非降。
概括一下,对于当前的数,无论最优解如何,对答案的贡献是一定的。而为了保证之后的解也最优,令$y$减小到$x$,可以保证之后的解最优,且不会影响当前的最优解
代码好短……
//minamoto
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
priority_queue<int> q;
int n;long long ans;
int main(){
n=read();
while(n--){
int x=read();q.push(x);
if(x<q.top()){
ans+=q.top()-x;
q.pop();q.push(x);
}
}
printf("%lld\n",ans);
return ;
}
P4597 序列sequence的更多相关文章
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 【洛谷】【堆+结论】P4597 序列sequence
[题目背景:] 原题cf13c 数据加强版(就是说原来能用DP做现在不行了QwQ) [题目描述:] 给定一个序列,每次操作可以把某个数+1-1.要求把序列变成非降数列.而且要求修改后的数列只能出现修改 ...
- 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 ...
随机推荐
- 使用tcmalloc编译启动时宕机
链接时增加了-ltcmalloc,编好之后服务器第一次启动就宕机了,code文件堆栈如下: Program terminated with signal SIGABRT, Aborted. # ) a ...
- Callable接口使用以及计算斐波那契数字的数值总和
一.简单使用 Runnable是执行工作的独立任务,但是它不返回任何值.如果你希望任务完成的时能够返回一个值,那么可以实现一个Callable接口.在Java SE5中引入的Callable是一种具有 ...
- 112. Path Sum (Tree; DFS)
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...
- 69. Sqrt(x) (Divide-and-Conquer)
Implement int sqrt(int x). Compute and return the square root of x. 注意: 计算平方的时候可能会溢出,所以mid要定义为long 另 ...
- ubuntu eclipse opencv环境配置
项目——Properties——C/C++ Build——Settings 配置包含目录: GCC C++ Compiler ——Includes /usr/include /usr/local/ ...
- 集合_java集合框架
转载自http://blog.csdn.net/zsw101259/article/details/7570033 Java集合框架图 简化图: Java平台提供了一个全新的集合框架.“集合框架”主要 ...
- STREAMING #5 题解 3.高位网络
高维网络 [题目描述] 现在有一个 d 维的坐标网格,其中第 i 维坐标的范围是[0,a_i].在这个范围内建立一个有向图:我们把范围内的每个整点(每一维坐标均为整数的点)当做图上的顶点.设点 A(0 ...
- ubuntu创建wifi热点plasma-nm
第一步:安装 plasma-nm sudo apt-get install plasma-nm 第二步:启动程序 可以使用 Alt+F2 后,搜索 kde-nm-connection-editor 也 ...
- up6-自定义文件存储路径
在up6.2中有两种保存模式,一种是md5一种是uuid. md5由PathMd5Builder生成存储路径.md5主要提供给文件使用,可在服务器端保存唯一的文件,有效避免重复文件. uuid由Pat ...
- Android-ListView-ArrayAdapter
我在上一篇博客中Android-动态添加控件到ScrollView,写到可以用Java动态添加控件到Scrollview的孩子LinearLayout里面去,这种方式是不合理的,因为这种方式是一次性把 ...