BZOJ 1367 [Baltic2004]sequence 解题报告
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 <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long
const 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]<key[y]) std::swap(x,y);
rs=Merge(rs,y);
if(dis[ls]<dis[rs]) std::swap(ls,rs);
dis[x]=dis[rs]+1;
siz[x]=siz[ls]+siz[rs]+1;
return x;
}
void maintain()
{
int x;
while(rig[m]-rig[m-1]+1>>1<siz[x=root[m]])
root[m]=Merge(ls,rs);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",key+i),key[i]-=i;
++m,rig[m]=root[m]=i,siz[i]=1;
while(key[root[m-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
BZOJ 1367 [Baltic2004]sequence 解题报告的更多相关文章
- BZOJ 1367: [Baltic2004]sequence [可并堆 中位数]
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1111 Solved: 439[Submit][ ...
- bzoj 1367: [Baltic2004]sequence
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Description Input Output 一个整数R Sa ...
- BZOJ 1367 [Baltic2004]sequence (可并堆)
题面:BZOJ传送门 题目大意:给你一个序列$a$,让你构造一个递增序列$b$,使得$\sum |a_{i}-b_{i}|$最小,$a_{i},b_{i}$均为整数 神仙题.. 我们先考虑b不递减的情 ...
- 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)
1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ...
- BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 521 Solved: 159 [ Subm ...
- 1367: [Baltic2004]sequence
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1090 Solved: 432 [Submit ...
- USACO Section2.1 Sorting a Three-Valued Sequence 解题报告
sort3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- 【BZOJ】1367: [Baltic2004]sequence
题意 给\(n(n \le 10^6)\)个数的序列\(a\),求一个递增序列\(b\)使得\(\sum_{i=1}^{n} |a_i-b_i|\)最小. 分析 神题啊不会. 具体证明看黄源河论文&l ...
- timus 1175. Strange Sequence 解题报告
1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...
随机推荐
- TensorFlow深度学习实战---图像数据处理
图像的亮度.对比度等属性对图像的影响非常大,这些因素都会影响最后的识别结构.当然,复杂的预处理过程可能会导致训练效率的下降(利用TensorFlow中多线程处理输入数据的解决方案). 同一不同的原始数 ...
- [C++]boost dijkstra获得两点间的最短路
需求是只需要得到两点间的最短路,不需要求得单源对于全图的最短路,使用boost中的dijsktra_shortest_path,当得到目标点的最短路时直接throw exception. #inclu ...
- shell 判断日期间隔及润年
#!/bin/bash test.sh until echo "----------------------------------" echo "请输入您的选择:&qu ...
- HIVE简介及安装
一.简介 百度百科HIVE定义: hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运 ...
- kubernetes nfs-client-provisioner外部存储控制器
介绍: nfs-client-provisione是一个专门用于NFS外部目录挂载的控制器,当多个副本创建时,他们的命名方式如下: pv provisioned as ${namespace}-${p ...
- Java 学习笔记 ------第五章 对象封装
本章学习目标: 了解封装的概念与实现 定义类.构造函数与方法 使用方法重载与不定长度自变量 了解static方法 一.Java封装概念 在面向对象程式设计方法中,封装(英语:Encapsulation ...
- Python:Python的运行过程
1.Python是什么 和Java以及c#一样,Python也是一门基于虚拟机的语言.熟悉Java开发的人在命令行执行一个Java程序的过程通常如下: javac hello.java java he ...
- 博弈---ZOJ 3057 Beans Game(DP博弈)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3057 有豆类三个桩.TT和DD挑选任意数量的豆子从任何两堆轮流任何桩或相同 ...
- "数学口袋精灵"bug
首先要部署这个app项目就是第一步: 一.前提下载并安装JDK 在线图解:手把手教你安装JDK http://www.lvtao.net/server/windows-setup-jdk.h ...
- Robot 模拟操作键盘 实现复制粘贴功能;
1.代码逻辑 : a.封装一个粘贴的方法体:setAndctrlVClipboardData(String string);参数string是需要粘贴的内容 : b.声明一个StringSelecti ...