Description

Input

Output

一个整数R

Sample Input

7
9
4
8
20
14
15
18

Sample Output

13

解题思路:

有趣的数学题。
首先确定序列的构造方式。
要求差的绝对值最小,并且递增。
这肯定是照着A序列做的,那么很显然的结论:
若A是递增的,那么Z一定是A序列。
若A是平的,那么Z一定是公差为1的等差数列,中位数为A中的唯一值。
那么就发现了,若保证其非减的话是非常容易得到最优解的。
不断合并中位数即可,原理就是绝对值函数那个好几截棍。(数学课要好好听)
合并中位数可以用可并堆,因为其定义为排名在中间的数,不是不断弹就好了。
代码:
 #include<cstdio>
#include<cstring>
#include<algorithm>
#define lll l[x].ls
#define rrr l[x].rs
typedef long long lnt;
struct lhnt{
int ls;
int rs;
int fa;
int dis;
lnt val;
}l[];
struct seg{
int l;
int r;
int wgt;
int root;
lnt val;
seg(){};
seg(int x,lnt y)
{
l=r=root=x;
wgt=;
val=y;
}
}st[];
int top;
int n;
lnt a[];
lnt b[];
int merge(int x,int y)
{
if(!x||!y)
return x+y;
if(l[x].val<l[y].val)
std::swap(x,y);
rrr=merge(rrr,y);
l[rrr].fa=x;
if(l[rrr].dis>l[lll].dis)
std::swap(lll,rrr);
l[x].dis=l[rrr].dis+;
return x;
}
int pop(int x)
{
return merge(lll,rrr);
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("my.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]),a[i]-=i;
st[++top]=seg(i,a[i]);
l[i].val=a[i];
while(top>&&st[top].val<st[top-].val)
{
int x=top-,y=top;
top--;
st[x].root=merge(st[x].root,st[y].root);
st[x].wgt+=st[y].wgt;
st[x].r=st[y].r;
while(st[x].wgt>((st[x].r-st[x].l+)/))
{
st[x].root=pop(st[x].root);
st[x].wgt--;
}
st[top].val=l[st[top].root].val;
}
}
lnt ans=;
for(int i=;i<=top;i++)
for(int j=st[i].l;j<=st[i].r;j++)
{
b[j]=st[i].val;
ans+=std::abs(a[j]-b[j]);
}
printf("%lld\n",ans);
return ;
}
 

BZOJ1367: [Baltic2004]sequence(左偏树)的更多相关文章

  1. bzoj1367 [Baltic2004]sequence 左偏树+贪心

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1367 题解 先考虑条件为要求不下降序列(不是递增)的情况. 那么考虑一段数值相同的子段,这一段 ...

  2. 【BZOJ1367】[Baltic2004]sequence 左偏树

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

  3. BZOJ1367 BOI2004Sequence(左偏树)

    首先考虑把bi和ai同时减i,问题变为非严格递增.显然如果a是一个递减序列,b序列所有数都取其中位数最优.于是划分原序列使得每一部分递减,然后考虑合并相邻两段.如果前一段的中位数<=后一段的中位 ...

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

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

  5. BZOJ1367 [Baltic2004]sequence 堆 左偏树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1367 题意概括 Description Input Output 一个整数R 题解 http:// ...

  6. BZOJ1367 [Baltic2004]sequence 【左偏树】

    题目链接 BZOJ1367 题解 又是一道神题,, 我们考虑一些简单的情况: 我们先假设\(b_i\)单调不降,而不是递增 对于递增序列\(\{a_i\}\),显然答案\(\{b_i\}\)满足\(b ...

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

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

  8. 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]

    题目传送门 数字序列 题目描述 给定一个整数序列 a1​,a2​,⋅⋅⋅,an​ ,求出一个递增序列 b1​<b2​<⋅⋅⋅<bn​ ,使得序列 ai​ 和 bi​ 的各项之差的绝对 ...

  9. [BOI2004]Sequence 数字序列(左偏树)

    PS:参考了黄源河的论文<左偏树的特点及其应用> 题目描述:给定一个整数序列\(a_1, a_2, - , a_n\),求一个递增序列\(b_1 < b_2 < - < ...

随机推荐

  1. 不安全的直接对象引用:你的 ASP.NET 应用数据是否安全?

    介绍 作为一个在X94的航空工程师,你的老板要求你从2号楼的工程图中检索出一个特定的专利.不幸的是,进入大楼需要你出示你具有进入大楼的资格的证明,然后你迅速地以徽章的形式出示给了保安.到了十三楼,进入 ...

  2. jQuery -&gt; 怎样【先创建、再改动、后加入】 DOM元素

    怎样一气呵成地.on the fly地操作DOM元素呢? 比如顺序运行[创建]-> [改动]-> [加入]三个动作. 因为jQuery支持链式操作,事实上就是设计模式的builder模式, ...

  3. hdu3468 Treasure Hunting 二分匹配

    //给一个n*m的图 //.表示空白地 //*表示有黄金 //#表示墙 //一个人须要依照A...Z..a..z的顺序以最短路径走到下一个 //每次仅仅能在他的路线上经过的地方取一块黄金 //问最多能 ...

  4. C++ double转string类型以及MFC控件简单使用方法

    这两天项目须要,測试c++库里面内容.生成jar再给Android调用.我没有学过C++,如今開始记录C++简单使用方法.測试时候一般都是使用mfc程序来測试.要输入值.显示结果吗.我用的编译环境vs ...

  5. iOS9适配小结

    前言 最新公布的app版本号适配了iOS9.总结一下适配过程的几个要点. Bitcode iOS9此番推出了新的特性:Bitcode,关于Bitcode的资料大家能够在网上找.Bitcode要求pro ...

  6. pchip和spline差别

  7. lua实现大数运算

    lua实现的大数运算,代码超短,眼下仅仅实现的加减乘运算 ------------------------------------------------ --name: bigInt --creat ...

  8. Java JNI 入门篇——传递数组与修改数组

    这里不在重复JavaJNI 的开发过程了,不熟悉的同学请参考:Java JNI HelloWorld 直接上主要代码: ArrayJNI.Java package com.example.jni; p ...

  9. hpuoj--校赛--与学妹滑雪(最短路+精度判断)

    问题 G: 感恩节KK专场--与学妹滑雪 时间限制: 1 Sec  内存限制: 128 MB 提交: 284  解决: 25 [提交][状态][讨论版] 题目描述 这周下的雪好大好大,不过这正和KK学 ...

  10. 搭建Mysql双机热备 (主从同步)

    准备两台centos7主机:10.0.18.132 master 10.0.18.136  slave 先把selinux关闭,iptables关闭  或者添加端口 132 master安装好Mysq ...