传送门

题解

完全看不懂大佬们在说什么……特别是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$,可以保证之后的解最优,且不会影响当前的最优解

代码好短……

 1 //minamoto
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<queue>
 5 using namespace std;
 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 7 char buf[1<<21],*p1=buf,*p2=buf;
 8 inline int read(){
 9     #define num ch-'0'
10     char ch;bool flag=0;int res;
11     while(!isdigit(ch=getc()))
12     (ch=='-')&&(flag=true);
13     for(res=num;isdigit(ch=getc());res=res*10+num);
14     (flag)&&(res=-res);
15     #undef num
16     return res;
17 }
18 priority_queue<int> q;
19 int n;long long ans;
20 int main(){
21     n=read();
22     while(n--){
23         int x=read();q.push(x);
24         if(x<q.top()){
25             ans+=q.top()-x;
26             q.pop();q.push(x);
27         }
28     }
29     printf("%lld\n",ans);
30     return 0;
31 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9462864.html

P4597 序列sequence相关推荐

  1. Oracle数据库中序列(SEQUENCE)的用法详解

    http://database.51cto.com/art/201108/280742.htm 在Oracle数据库中,什么是序列呢?它的用途是什么?序列(SEQUENCE)其实是序列号生成器,可以为 ...

  2. oracle初始化序列值,如何修改序列(Sequence)的初始值(START WITH)

    Oracle 序列(Sequence)主要用于生成流水号,Oracle EBS系统中是经常用到的.但是,有时需要修改序列初始值(START WITH)时,好多人凭感觉认为:Alter Sequence ...

  3. mysql添加序列触发器_Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例...

    问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的.而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增列的说法,但却可以通过触发器(tri ...

  4. 序列(SEQUENCE)、同义词(SYNONYM)

    --============================================= --SQL基础--> 序列(SEQUENCE).同义词(SYNONYM) --========== ...

  5. Oracle sql创建序列sequence

    知道的创建表序列的用途是当建立表的时候,Oracle不像Mysql一样会有自动主键增长AUTO_INCREMENT,所有如果需要主键自动增长的效果,Oracle提供了序列sequence方式. 创建序 ...

  6. oracle如何实现自增?----用序列sequence的方法来实现

    将表t_user的字段ID设置为自增:(用序列sequence的方法来实现) ----创建表 Create  table  t_user( Id number(6),userid varchar2(2 ...

  7. oracle 序列缓存的作用,Oracle序列sequence 深入理解

    Oracle序列:序列(Sequence)创建.使用.修改.删除,序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成. 语法:创 ...

  8. oracle 序列 清除,Oracle序列(Sequence)创建、使用、修改、删除

    Oracle序列(Sequence)创建.使用.修改.删除 一: 创建序列: 语法: CREATE SEQUENCE sequence_name [START WITH num] [INCREMENT ...

  9. Oracle的新建序列sequence

    新建sequence序列, 运用场景:生成流水ID. 新建序列如下: max value:生成序列的最大值 cache size:一般是0,如果缓存较大时,根据需求添加size. cycle:循环

最新文章

  1. 《HiWind企业快速开发框架实战》(0)目录及框架简介
  2. Android中如何使用命令行查看内嵌数据库SQLite3
  3. 性能优化之数据库优化
  4. Bootstrap 列平移/列偏移
  5. C#中的String类
  6. 巧用Excel函数进行数据转置
  7. Mybatis配置注意事项
  8. java poi excel 视图-分页浏览 效果
  9. 用户-用户生命周期切分(下)
  10. 在MSTR中使用ECharts作为VI模板(2)-- 数据筛选器
  11. 有孚网络吕鑫:融媒体数据管理的实践与探讨
  12. Xinput1_3.dll下载+丢失修复
  13. [Java]-zip包的使用
  14. java计算机毕业设计校园疫情防控管理软件源码+数据库+系统+lw文档+部署
  15. 电脑录屏时如何只录电脑内部声音?
  16. 什么,你还在用 momentJs 处理相对时间
  17. SQL注入绕过安全狗
  18. MySQL函数生成订单编号
  19. 简单多边形与圆相交求面积
  20. UPUPWANK配置SSL证书教程

热门文章

  1. python 签名计算 请求参数签名
  2. Altair Compose2020中文版
  3. 高斯消元整数版和浮点数版实现
  4. 树网的核(codevs 1167)
  5. iOS - Quartz 2D 画板绘制
  6. 【编程题】简单的四则运算
  7. mahout推荐10-尝试GroupLens数据集
  8. C#实现在Winform中嵌入Word和Excel
  9. Fiddler 抓包高级进阶篇-天罗地网抓包大法
  10. 生产环境下,oracle不同用户间的数据迁移。第一部分