考虑两种情况:

1.\(a_1\)<\(a_2\)<\(a_3\)<\(a_4\)...<\(a_n\)

直接令\(b_i\)=\(a_i\),最小。

2.\(a_1\)>\(a_2\)>\(a_3\)>\(a_4\)...>\(a_n\)

初一的一道绝对值题是这题的弱化版。

给定\(a_1\),\(a_2\)...\(a_n\),求一点x,使得\(abs(a_1-x)\)+\(abs(a_2-x)\)...+\(abs(a_n-x)\)值最小

直接求中位数即可(初一的知识——绝对值)

同理,关于2.我们令\(b_i\)取1到i中位数即可。

那么这道题我们就可以看做是许多个严格递减的序列,每一个序列的答案我们是可以知道的。所以我们所要做的就是合并答案即可。

怎么维护每一次合并呢?

我们想到了左偏树。

对于左偏树,我们每放入一个新节点,我们就\(-=i\),使得原应严格下降的序列变成\(a_{i-1}>=a_i\),再判断新加入的节点是否符合这个规则,不符合就与上一个merge。

因为我们是要求中位数,所以节点的size不应超过它的范围的二分之一再\(+1\),所以我们要一直\(size--\),同时删除这个节点。

最后我们求答案即可。

注:因为我们一开始就减去了i,所以在如果要输出序列是要加上i。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct data
  4. {
  5. int l,r,size,fa,val;
  6. }s[1000001];
  7. int val[1000001],n,k,cnt,ch[1000001][2],dis[1000001];
  8. long long ans;
  9. int merge(int x,int y)
  10. {
  11. if(!x||!y)
  12. {
  13. return x+y;
  14. }
  15. if(val[x]<val[y])
  16. {
  17. swap(x,y);
  18. }
  19. ch[x][1]=merge(ch[x][1],y);
  20. if(dis[ch[x][0]]<dis[ch[x][1]])
  21. {
  22. swap(ch[x][0],ch[x][1]);
  23. }
  24. dis[x]=dis[ch[x][1]]+1;
  25. return x;
  26. }
  27. int read()
  28. {
  29. char ch=getchar();
  30. int sum=0,f=1;
  31. while(ch<'0'||ch>'9')
  32. {
  33. if(ch=='-')
  34. {
  35. f=-1;
  36. }
  37. ch=getchar();
  38. }
  39. while(ch<='9'&&ch>='0')
  40. {
  41. sum=sum*10+ch-'0';
  42. ch=getchar();
  43. }
  44. return sum*f;
  45. }
  46. int main()
  47. {
  48. n=read();
  49. dis[0]=-1;
  50. for(int i=1;i<=n;i++)
  51. {
  52. val[i]=read();
  53. val[i]-=i;
  54. }
  55. for(int i=1;i<=n;i++)
  56. {
  57. s[++cnt]=(data){
  58. i,i,1,i,val[i]
  59. };
  60. while(cnt!=1&&s[cnt-1].val>s[cnt].val)
  61. {
  62. cnt--;
  63. s[cnt].fa=merge(s[cnt].fa,s[cnt+1].fa);
  64. s[cnt].size+=s[cnt+1].size;
  65. s[cnt].r=s[cnt+1].r;
  66. while(s[cnt].size>(s[cnt].r-s[cnt].l+3)/2)
  67. {
  68. s[cnt].size--;
  69. s[cnt].fa=merge(ch[s[cnt].fa][0],ch[s[cnt].fa][1]);
  70. }
  71. s[cnt].val=val[s[cnt].fa];
  72. }
  73. }
  74. int m=1;
  75. for(int i=1;i<=n;i++)
  76. {
  77. if(i>s[m].r)
  78. {
  79. m++;
  80. }
  81. ans+=abs(s[m].val-val[i]);
  82. }
  83. printf("%lld\n",ans);
  84. m=1;
  85. for(int i=1;i<=n;i++)
  86. {
  87. if(i>s[m].r)
  88. {
  89. m++;
  90. }
  91. printf("%d ",s[m].val+i);
  92. }
  93. return 0;
  94. }

【XSY2985】【BZOJ1367】【Baltic2004】sequence的更多相关文章

  1. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  2. WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】

    http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF ...

  3. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  4. SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  5. SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  6. WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】

    http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...

  7. WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】

    WCF Interview Questions – Part 4   This WCF service tutorial is part-4 in series of WCF Interview Qu ...

  8. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  9. 【小白的CFD之旅】13 敲门实例【续3】

    接上文[小白的CFD之旅]12 敲门实例[续2] 4 Results4.1 计算监测图形4.2 Graphics4.2.1 壁面温度分布4.2.2 创建截面4.2.3 显示截面物理量4.2.4 Pat ...

  10. 【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/1/5

    [iCore3 ARM代码下载地址][全部]DEMO1.0测试程序发布例程一:ARM驱动三色LED例程二:读取arm按键状态例程三:EXTI中断输入实验——读取ARM按键状态例程四:USART通信实验 ...

随机推荐

  1. bootstrap准备工作(1)

    1.下载bootstrap包 http://v3.bootcss.com/getting-started/#download 2.下载结构 如果要用js里面的js效果,需要先插入juqery.js & ...

  2. Kubernetes的RBAC是啥

    RBAC: Role-Based Access Control,基于角色的权限控制,有以下三种角色 Role:角色,它其实是一组规则,定义了一组API对象的操作权限 Subject:被作用者,可以是人 ...

  3. Python 元组(Tuple)操作详解

    Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号, 列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可 一.创建元组 代码如下: tup1 = (' ...

  4. 【TencentOS tiny】又有一个操作系统开源

    新闻 2019年9月18日,腾讯宣布将开源 自主研发的轻量级物联网实时操作系统TencentOS tiny.相比市场上其它系统,腾讯TencentOS tiny在资源占用.设备成本.功耗管理以及安全稳 ...

  5. Spring中@Import的各种用法以及ImportAware接口

    @Import 注解 @Import注解提供了和XML中<import/>元素等价的功能,实现导入的一个或多个配置类.@Import即可以在类上使用,也可以作为元注解使用. @Target ...

  6. SpringMVC快速入门记录(二)

    一.数组参数绑定和List参数绑定 1.数组参数绑定 提交多个相同name的参数,保持name的名字和Controller方法参数的数组名称相同即可. 2.List参数绑定 List中存放对象,并将定 ...

  7. Python3_基础

    目录 数据类型 变量 数据类型的转换 算术操作符 输入 字符串常用方法 数据类型 我们先来看看三种常见的数据类型 字符串 str 在Python中,字符串一般都用引号引起来,不管是用单引号还是双引号都 ...

  8. java高并发_博客-网址-资料 推荐

    大概说一下自己作为入门学习java高并发的博客地址,很不错在自己的博客里记录一下:如果能有刷到我的博客的骚年,又刚好想了解java高并发,强烈推荐看看 地址:http://www.itsoku.com ...

  9. HNOI2012 永无乡 无旋Treap

    题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...

  10. [BZOJ1965][AHOI2005] 洗牌 - 扩展欧几里得

    题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...