https://www.lydsy.com/JudgeOnline/problem.php?id=5059

题意:将原序列{ai}改为一个递增序列{ai1}并且使得abs(ai-ai1)的和最小。

如果一个数列是递增的则不予考虑,如果是递减的,那么应该将这个递减序列每一个数都修改为这个序列的中位数(如果中位数是两数平均数则两数间任意一数都可以),手推一下可以知道这个性质的正确性。

因为后面的(中位)数小才会向前合并,所以新的中位数一定在前面或后面数列从小到大排序后的前半段(包含中位数)中(后面数列比中位数大的部分(不在堆中)一定比前面数列的中位数大),维护一个大根可并堆存从小到大排序后区间内的后半段数然后向前合并就能得到新的中位数。

嗯不错的题?

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
int n;
int ch[maxn][]={},siz[maxn]={},dis[maxn]={},val[maxn]={};
int l[maxn]={},r[maxn]={},b[maxn]={},tot=;;
int a[maxn]={};
inline void updata(int x){
siz[x]=siz[ch[x][]]+siz[ch[x][]]+;
}
int merge(int x,int y){
if(x==)return y;if(y==)return x;
if(val[x]<val[y])swap(x,y);
ch[x][]=merge(ch[x][],y);
if(dis[ch[x][]]>dis[ch[x][]])swap(ch[x][],ch[x][]);
dis[x]=dis[ch[x][]]+;
updata(x);
return x;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);siz[i]=;val[i]=a[i];
l[++tot]=i;r[tot]=i;b[tot]=i;
while(tot>&&val[b[tot-]]>val[b[tot]]){
b[tot-]=merge(b[tot-],b[tot]);
r[tot-]=r[tot];
while(siz[b[tot-]]>(r[tot-]-l[tot-]+)/)
b[tot-]=merge(ch[b[tot-]][],ch[b[tot-]][]);
--tot;
}
}
long long ans=;
for(int i=;i<=tot;i++){
for(int j=l[i];j<=r[i];j++){
ans+=abs(val[b[i]]-a[j]);
}
}printf("%lld\n",ans);
return ;
}

BZOJ 5059: 前鬼后鬼的守护 可并堆 左偏树 数学的更多相关文章

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

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

  2. BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ...

  3. 【BZOJ 1455】 1455: 罗马游戏 (可并堆-左偏树+并查集)

    1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ...

  4. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  5. BZOJ 2809: [Apio2012]dispatching(可并堆 左偏树板题)

    这道题只要读懂题目一切好说. 给出nnn个点的一棵树,每一个点有一个费用vvv和一个领导力aaa,给出费用上限mmm.求下面这个式子的最大值ax∗∣S∣ ( S⊂x的子树, ∑iv[i]≤m )\la ...

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

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

  7. bzoj 4003: 城池攻占 左偏树

    题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...

  8. BZOJ 5494: [2019省队联测]春节十二响 (左偏树 可并堆)

    题意 略 分析 稍微yy一下可以感觉就是一个不同子树合并堆,然后考场上写了一发左偏树,以为100分美滋滋.然而发现自己傻逼了,两个堆一一对应合并后剩下的一坨直接一次合并进去就行了.然鹅我这个sb把所有 ...

  9. BZOJ 5059 前鬼后鬼的守护

    题解: 解法一:用函数斜率什么的,不会,留坑 解法二: 某一个序列都变成一个值那么中位数最优 加入一个元素,与前面那一段区间的中位数比较 x>=mid什么事也不做 x<mid合并两端区间 ...

随机推荐

  1. DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)

    public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...

  2. Python Challenge 第 4 关攻略:linkedlist

    代码 import requests url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={}" ...

  3. TreeCollection2

    Tree Collection 2 Table of Contents Introduction Structure Interfaces Data Node structure Tree struc ...

  4. MinGw 和 cygwin 的区别和联系

    原创 by zoe.zhang .......................................................... 1. windows与Linux操作系统的不同   ...

  5. Nginx实现代理和用户验证

    1.下载Nginx 首先去官网http://nginx.org/en/download.html下载需要的版本即可,无需安装,只需要打开nginx.exe文件,nginx.exe的服务就开启了.打开h ...

  6. 安装virtualenv(Scrapy)

    Windows 10家庭中文版,Python 3.6.4, virtualenv用来提供一个应用程序独立的 运行环境,这个独立是相对于系统的Python运行环境而言,开发者可以在virtualenv建 ...

  7. 【Android开发日记】之入门篇(七)——Android数据存储(上)

    在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...

  8. Jmeter运行结果unicode编码乱码问题

    一.web页面乱码 比如访问百度返回页面显示乱码,如下会有问号 如果想让他显示中文可以按以下操作: 1.打开jmter配置文件 bin/jmeter.properties 2.修改配置文件,查找“sa ...

  9. AdvStringGrid 标题头

    标题头内容: 字体: 标题头高度: 头的对齐方式:

  10. python图片处理(三)

    ji那天用到了python图片处理中的二值图像的骨架提取,在matlab中通过输入图像的二值,来处理得到图像的骨架, skelimage = bwmorph(im, 'skel', inf); 在ma ...