博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1367 [Baltic2004]sequence 解题报告
阅读量:5152 次
发布时间:2019-06-13

本文共 1238 字,大约阅读时间需要 4 分钟。

BZOJ 1367 [Baltic2004]sequence

Description

给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots<z_N\),使得\(R=|t_1-z_1|+|t_2-z_2|+\dots+|t_N-z_N|\)的值最小,本题中,我们只需求出这个最小的\(R\)

Input

\(1\)行为\(N(1\le N\le10^6)\)

\(2\)行到第\(N+1\)行,每行一个整数。第\(K+1\)行为\(t_k(0\le t_k \le 2\times 10^9)\)


思路:

如果我们需要求一个非递减的\(z\)

考虑特殊情况

注意到对一个递增的序列,有\(z_i=t_i\)

对一个递减的序列,有\(z_i\)\(t_i\)的中位数

所以猜测可以找到一种区间的划分,使每一段区间的\(z_i\)都是这段区间\(t_i\)的中位数

感性理解一下感觉是对的。

实现起来需要动态维护末尾的区间的中位数,我们每次新进一个元素的时候,自己成一个区间,然后比一下和末尾的区间的中位数,比\(\text{Ta}\)小就合并了。注意到可以用堆维护中位数,然后合并就可并堆了。

最后一点,上面的情况都是针对非递减的情况,改成递增也很简单,把\(t_i=t_i-i\)就行了,感性理解一下似乎挺容易的。


Code:

#include 
#include
#include
#define ll long longconst int N=1e6+10;int n,m,dis[N],key[N],rig[N],root[N],siz[N],ch[N][2];#define ls ch[x][0]#define rs ch[x][1]int Merge(int x,int y){ if(!x||!y) return x+y; if(key[x]
>1
key[root[m]]) root[m-1]=Merge(root[m-1],root[m]),rig[m-1]=rig[m],--m,maintain(); } ll ans=0; for(int i=1;i<=m;i++) for(int j=rig[i-1]+1;j<=rig[i];j++) ans=ans+abs(key[j]-key[root[i]]); printf("%lld\n",ans); return 0;}

2018.12.10

转载于:https://www.cnblogs.com/butterflydew/p/10097642.html

你可能感兴趣的文章
table与html实例
查看>>
OOP的几个原则-----OCP:开闭原则(上)
查看>>
Python老男孩 day18 文件处理模式b模式
查看>>
POJ2104 K-th Number(主席树)
查看>>
可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)
查看>>
17年day3
查看>>
Redis
查看>>
c++buider2010 快捷技巧
查看>>
第一次发贴
查看>>
DB2检测表字段改动的方法(不用触发器)
查看>>
Windows 2003,XP安装Windows Phone 7
查看>>
Windows hackson (rundll32--ADS)
查看>>
Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
查看>>
REST API TO MiniProgram 上线WordPress官方插件库
查看>>
百叶窗效果
查看>>
Linux 文件流管理
查看>>
分享自fissure 《Linux编程 报错 找不到 term.h和curses.h》
查看>>
postgresql客户端连接错误的解决方法【转】
查看>>
解决Wireshark没有网卡问题
查看>>
通过一个真实故事理解SOA监管(zz)
查看>>