Description

Input

Output

一个整数R

Sample Input

7
9
4
8
20
14
15
18

Sample Output

13

HINT

所求的Z序列为6,7,8,13,14,15,18.
R=13

  1. /*
  2. 思维很扭曲(反正我想不出来)的一道题。
  3. 先想想不下降的:
  4. 考虑一个正序的序列,z[i]=t[i]
  5. 考虑一个逆序的序列,z[i]=x(x是逆列的中位数)
  6. 既然是这样那么我们就可以把整个序列化分成逆序的若干段,对于每段求中位数(正序的可看成num个逆序的)。
  7. 维护中位数用左偏树,具体方法是始终保持堆中数的个数不大于原数个数的一半。
  8. 至于改成上升的,把原序列t[i]-=i。
  9.  
  10. PS:题解中的root[i]和堆中下标的关系把我看蒙了,所以这里说一下。
  11. 代码中是建立了n个堆,然而不断合并,最终变成了tot个。
  12. root[i]表示第i个堆(合并后的)的堆顶是哪个元素。
  13. */
  14. #include<cstdio>
  15. #include<iostream>
  16. #include<cstdlib>
  17. #define N 1000010
  18. using namespace std;
  19. int t[N],root[N],l[N],r[N],num[N],cnt[N],n,tot;
  20. struct node{
  21. int l,r,dis,w;
  22. };node heap[N];
  23. int merge(int a,int b){
  24. if(a==||b==)return a+b;
  25. if(heap[a].w<heap[b].w)swap(a,b);
  26. heap[a].r=merge(heap[a].r,b);
  27. if(heap[heap[a].r].dis>heap[heap[a].l].dis)
  28. swap(heap[a].r,heap[a].l);
  29. heap[a].dis=heap[heap[a].r].dis+;
  30. return a;
  31. }
  32. int pop(int a){
  33. return merge(heap[a].l,heap[a].r);
  34. }
  35. int main(){
  36. scanf("%d",&n);
  37. for(int i=;i<=n;i++)
  38. scanf("%d",&t[i]),t[i]-=i;
  39. for(int i=;i<=n;i++){
  40. ++tot;
  41. l[tot]=r[tot]=i;
  42. num[tot]=cnt[tot]=;
  43. root[tot]=i;
  44. heap[i].dis=heap[i].l=heap[i].r=;
  45. heap[i].w=t[i];
  46.  
  47. while(tot>&&heap[root[tot]].w<heap[root[tot-]].w){
  48. --tot;
  49. root[tot]=merge(root[tot],root[tot+]);
  50. num[tot]+=num[tot+],cnt[tot]+=cnt[tot+],r[tot]=r[tot+];
  51. for(;cnt[tot]*>num[tot]+;--cnt[tot])
  52. root[tot]=pop(root[tot]);
  53. }
  54. }
  55. long long ans=;
  56. for(int i=;i<=tot;i++)
  57. for(int j=l[i],w=heap[root[i]].w;j<=r[i];j++)
  58. ans+=abs(t[j]-w);
  59. cout<<ans;
  60. return ;
  61. }

sequence(bzoj 1367)的更多相关文章

  1. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  2. 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)

    1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ...

  3. BZOJ 1367: [Baltic2004]sequence [可并堆 中位数]

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1111  Solved: 439[Submit][ ...

  4. bzoj 1367: [Baltic2004]sequence

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MB Description Input Output 一个整数R Sa ...

  5. bzoj 1367 [ Baltic 2004 ] sequence —— 左偏树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1367 好题啊!论文上的题: 论文上只给出了不下降序列的求法: 先考虑特殊情况,如果原序列上升 ...

  6. BZOJ 1367 [Baltic2004]sequence (可并堆)

    题面:BZOJ传送门 题目大意:给你一个序列$a$,让你构造一个递增序列$b$,使得$\sum |a_{i}-b_{i}|$最小,$a_{i},b_{i}$均为整数 神仙题.. 我们先考虑b不递减的情 ...

  7. bzoj 1367 - sequence

    Description 给定一个序列\(t_1,t_2,\cdots,t_n\),求一个递增序列\(z_1<z_2<...<z_n\), 使得 \(R=|t_1−z_1|+|t_2− ...

  8. BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)

    1367: [Baltic2004]sequence Time Limit: 20 Sec   Memory Limit: 64 MB Submit: 521   Solved: 159 [ Subm ...

  9. 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)

    1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...

随机推荐

  1. abp zero mysql版正式发布

    AbpZero-MySql aspnet-zero-1.12.0的mysql版本来啦.跟mssql版一样的功能,一样的代码. 获取源码

  2. poj1190 生日蛋糕

    题意: 要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > ...

  3. Java&Xml教程(九)Java中通过XSD校验XML合法性

    Java XML校验API能够通过XSD(XML Schema Definition)校验XML文件内容的合法性.在下面的案例中使用javax.xml.validation.Validator 类通过 ...

  4. java 之 插入排序

    思想:将一个数组分成两组,左边那组始终有序,每次取右边那组插入到左边适当的位置,保证左边有序,当右边没有需要插入的数据的时候,整个数组是有序的.插入排序是稳定排序. 注:此图引用自https://ww ...

  5. SQLite与MySQL、SQLServer等异构数据库之间的数据同步

    SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎,实现了SQLite与SQLite数据库之间以及SQLite与异构数据库(Oracle.MySQL.SQLServer)之间的增量 ...

  6. bitcoin 源码解析 - 交易 Transaction

    bitcoin 源码解析 - 交易 Transaction(三) - Script 之前的章节已经比较粗略的解释了在Transaction体系当中的整体运作原理.接下来的章节会对这个体系进行分解,比较 ...

  7. mysql登录(linux)

    一.修改配置文件 查询路径 find / -name my.cnf 修改文件 vi my.cnf [mysqld]下面加上skip-grant-tables 二.登录数据库 重启mysql servi ...

  8. Java ArrayList中去掉相同的元素并保留相同元素中的最后一个

    实现思路:将list对象循环两次,拿外层数据和里面的数据对比,一样的删除外层(外层元素肯定比内存的靠前),如果一样的话,删除外层数据,这样最后输出外层数据的list,结果就能保证唯一性,并且保留了后面 ...

  9. 执行BarTender

    1.配置.btw模板 1.1.左侧创建“具名数据源” 1.2.条码属性,选择刚才的数据源 1.3.保存 2.配置.btin服务 2.1.点击 工具/Integration Builder” 2.2.创 ...

  10. pc端移动端兼容的大图轮播

    body, html { width: 100%; } * { margin:; padding:; list-style: none; } .haha { list-style-type: none ...