题解:

解法一:用函数斜率什么的,不会,留坑

解法二:

某一个序列都变成一个值那么中位数最优

加入一个元素,与前面那一段区间的中位数比较

x>=mid什么事也不做

x<mid合并两端区间

不停向前合并

用大根可并堆维护中位数

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=600009; int n;
long long ans=0; int fa[maxn]={0},ch[maxn][2]={0},ky[maxn]={0},dis[maxn]={0},siz[maxn]={0};
int Getf(int x){
while(fa[x])x=fa[x];
return x;
}
int Mer(int x,int y){
if((x==0)||(y==0))return x^y;
if(ky[x]<ky[y])swap(x,y);
ch[x][1]=Mer(ch[x][1],y);
fa[ch[x][1]]=1;
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
if(dis[ch[x][1]]>dis[ch[x][0]])swap(ch[x][0],ch[x][1]);
dis[x]=dis[ch[x][1]]+1;
return x;
} struct Sec{
int l,r,root;
Sec(){}
Sec(int ll,int rr,int x){
l=ll;r=rr;root=x;
}
void poppoint(){
int tm=(r-l+2)/2;
while(siz[root]>tm){
fa[ch[root][0]]=0;
fa[ch[root][1]]=0;
root=Mer(ch[root][0],ch[root][1]);
}
}
}Sta[maxn];
int top=0; int ab(int x){
if(x<0)return -x;
else return x;
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&ky[i]);
siz[i]=1;
}
for(int i=1;i<=n;++i){
Sta[++top]=Sec(i,i,i);
while(top>=2){
if(ky[Sta[top].root]>=ky[Sta[top-1].root])break;
Sta[top-1].root=Mer(Sta[top-1].root,Sta[top].root);
--top;
Sta[top].r=i;
Sta[top].poppoint();
}
}
for(int j=1;j<=top;++j){
// cout<<Sta[j].l<<' '<<Sta[j].r<<' '<<ky[Sta[j].root]<<endl;
for(int i=Sta[j].l;i<=Sta[j].r;++i){
ans+=ab(ky[Sta[j].root]-ky[i]);
}
}
cout<<ans<<endl;
return 0;
}

  

BZOJ 5059 前鬼后鬼的守护的更多相关文章

  1. BZOJ5059 前鬼后鬼的守护 【堆扩展】*

    BZOJ5059 前鬼后鬼的守护 Description 八云紫的式神八云蓝有一张符卡名为[式神-前鬼后鬼的守护],这张符卡的弹幕为BOSS从两侧向自机发射大玉,大玉后面跟着一些小玉,形成一个&quo ...

  2. BZOJ 5059: 前鬼后鬼的守护 可并堆 左偏树 数学

    https://www.lydsy.com/JudgeOnline/problem.php?id=5059 题意:将原序列{ai}改为一个递增序列{ai1}并且使得abs(ai-ai1)的和最小. 如 ...

  3. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  4. 探究C语言中的前++和后++

    小波带您探究c语言中的前++与后++: 欢迎吐槽,欢迎加QQ463431476. 欢迎关注!  现在来探究: 咱们先看第一个 i被赋值0,i++(后++)并没有输出1.   现在i被赋值0,++i,也 ...

  5. HMM 自学教程(七)前向后向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  6. STL——前闭后开区间表示法和function call 操作符

    前开后闭开区间表示法[) 任何一个STL算法,都需要获得由一对迭代器(泛型指针)所标示的区间,用以表示操作范围,这一对迭代器所标示的是个所谓的前闭后开区间,以[first,last)表示,也就是说,整 ...

  7. HMM 前向后向算法(转)

    最近研究NLP颇感兴趣,但由于比较懒,所以只好找来网上别人的比较好的博客,备份一下,也方便自己以后方便查找(其实,一般是不会再回过头来看的,嘿嘿 -_-!!) 代码自己重新写了一遍,所以就不把原文代码 ...

  8. 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...

  9. jquery取前、后、父、子元素

    前.prev(); 后.next(); 父.parent(); 子.children(); 注意:前的前是.prev().prev(),例如前元素无i,但前的前的i元素有i,不能写成.prev('i' ...

随机推荐

  1. IDEA代码检验出错

    该软件功能过于强大,会自动检验执行所需要的代码,所以会报错,但实际上我们有写 例如 解决方法 File-->setting 将error改为warning

  2. 用sql删除数据库重复的数据的方法

      /***********************************************两个意义上的重复记录:1.是完全重复的记录,也即所有字段均重复的记录,2.是部分关键字段重复的记录, ...

  3. centos 搭建 git 服务端和客户端

    centos 搭建git需要设置远程服务端和客户端.远程代码存放在服务端,多个客户端可以共享和维护服务端代码. 一.服务端主机 1.创建ssh,大部分默认已经安装,有ssh就跳过 yum instal ...

  4. greenplum 存储过程 返回结果集多列和单列

    参考: http://francs3.blog.163.com/blog/static/4057672720125231223786/

  5. java 加法变乘法

    加法变乘法 我们都知道:1+2+3+ - + 49 = 1225 (1) 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+10*11+12+...+27*28 ...

  6. {$DEFINE WANYI}

    var Form5: TForm5; {$DEFINE WANYI}implementation{$R *.dfm}procedure TForm5.Button1Click(Sender: TObj ...

  7. 看雪hello

    在看雪做了一道题目很简单,但是还是记录一下自己的学习. 用ida打开,然后shift+F12查看 这里可以看到基本的结构,转到pass查看 发现ATA XREF: sub_401770+Bo打开这里 ...

  8. SpringBoot邮件推送功能

    鞠躬,道歉 抱歉,迟到了近一年的更新,这一年挺忙的,发生了很多事情,就厚脸皮拖更了,抱歉. 现在状态回来了,打算分享下近期学到的东西,这一年期间学到的东西可能会随意更新,其实也就是玩了下C# + un ...

  9. 使用线程池测试cpu的并发计算能力

    接到一个需求是测试一下cpu并发计算能力,针对int和float求和单位时间能执行几次的问题.可能是服务器选型用到的参数. 开始使用的是fork-join,但是发现fork-join每次得到的结果值波 ...

  10. php的排序算法

    *对于算法来说,对于每个小伙伴来说都是比较头疼的,但是,为什么要学习算法? 算法是基础,算法能够提升智力,我想这两点就值得我们花时间去学习了.不要放弃,实在不会,先死记硬背下来,以后慢慢理解,一下是我 ...