【XSY2985】【BZOJ1367】【Baltic2004】sequence

考虑两种情况:
1.\(a_1\)<\(a_2\)<\(a_3\)<\(a_4\)...<\(a_n\)
直接令\(b_i\)=\(a_i\),最小。
2.\(a_1\)>\(a_2\)>\(a_3\)>\(a_4\)...>\(a_n\)
初一的一道绝对值题是这题的弱化版。
给定\(a_1\),\(a_2\)...\(a_n\),求一点x,使得\(abs(a_1-x)\)+\(abs(a_2-x)\)...+\(abs(a_n-x)\)值最小
直接求中位数即可(初一的知识——绝对值)
同理,关于2.我们令\(b_i\)取1到i中位数即可。
那么这道题我们就可以看做是许多个严格递减的序列,每一个序列的答案我们是可以知道的。所以我们所要做的就是合并答案即可。
怎么维护每一次合并呢?
我们想到了左偏树。
对于左偏树,我们每放入一个新节点,我们就\(-=i\),使得原应严格下降的序列变成\(a_{i-1}>=a_i\),再判断新加入的节点是否符合这个规则,不符合就与上一个merge。
因为我们是要求中位数,所以节点的size不应超过它的范围的二分之一再\(+1\),所以我们要一直\(size--\),同时删除这个节点。
最后我们求答案即可。
注:因为我们一开始就减去了i,所以在如果要输出序列是要加上i。
#include<bits/stdc++.h>
using namespace std;
struct data
{
int l,r,size,fa,val;
}s[1000001];
int val[1000001],n,k,cnt,ch[1000001][2],dis[1000001];
long long ans;
int merge(int x,int y)
{
if(!x||!y)
{
return x+y;
}
if(val[x]<val[y])
{
swap(x,y);
}
ch[x][1]=merge(ch[x][1],y);
if(dis[ch[x][0]]<dis[ch[x][1]])
{
swap(ch[x][0],ch[x][1]);
}
dis[x]=dis[ch[x][1]]+1;
return x;
}
int read()
{
char ch=getchar();
int sum=0,f=1;
while(ch<'0'||ch>'9')
{
if(ch=='-')
{
f=-1;
}
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
sum=sum*10+ch-'0';
ch=getchar();
}
return sum*f;
}
int main()
{
n=read();
dis[0]=-1;
for(int i=1;i<=n;i++)
{
val[i]=read();
val[i]-=i;
}
for(int i=1;i<=n;i++)
{
s[++cnt]=(data){
i,i,1,i,val[i]
};
while(cnt!=1&&s[cnt-1].val>s[cnt].val)
{
cnt--;
s[cnt].fa=merge(s[cnt].fa,s[cnt+1].fa);
s[cnt].size+=s[cnt+1].size;
s[cnt].r=s[cnt+1].r;
while(s[cnt].size>(s[cnt].r-s[cnt].l+3)/2)
{
s[cnt].size--;
s[cnt].fa=merge(ch[s[cnt].fa][0],ch[s[cnt].fa][1]);
}
s[cnt].val=val[s[cnt].fa];
}
}
int m=1;
for(int i=1;i<=n;i++)
{
if(i>s[m].r)
{
m++;
}
ans+=abs(s[m].val-val[i]);
}
printf("%lld\n",ans);
m=1;
for(int i=1;i<=n;i++)
{
if(i>s[m].r)
{
m++;
}
printf("%d ",s[m].val+i);
}
return 0;
}
【XSY2985】【BZOJ1367】【Baltic2004】sequence的更多相关文章
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】
http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】
http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...
- WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】
WCF Interview Questions – Part 4 This WCF service tutorial is part-4 in series of WCF Interview Qu ...
- Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】
原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...
- 【小白的CFD之旅】13 敲门实例【续3】
接上文[小白的CFD之旅]12 敲门实例[续2] 4 Results4.1 计算监测图形4.2 Graphics4.2.1 壁面温度分布4.2.2 创建截面4.2.3 显示截面物理量4.2.4 Pat ...
- 【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/1/5
[iCore3 ARM代码下载地址][全部]DEMO1.0测试程序发布例程一:ARM驱动三色LED例程二:读取arm按键状态例程三:EXTI中断输入实验——读取ARM按键状态例程四:USART通信实验 ...
随机推荐
- zui框架配置日期控件只显示年月
zui框架配置日期控件datetimepicker只显示年月 <!DOCTYPE html> <head> <script src="~/Scripts/jqu ...
- svg foreignObject的作用(文本换行,生成图片)
SVG内部利用foreignObject嵌入XHTML元素 <foreignObject>元素的作用是可以在其中使用具有其它XML命名空间的XML元素,换句话说借助<foreignO ...
- Android Studio 优秀插件: Parcelable Code Generator
这里假设我们已经会使用 Parcelable 序列化一个对象了~~ 那么大家会发现 Parcelable 使用起来有些复杂,因为我们要自己复写 几个方法,而且当类的属性比较多的时候,我们就会难受了,又 ...
- 52个有效方法(1) - 了解Objective-C语言的起源
Objective-C语言使用的是"消息结构"而非"函数调用" "消息结构"和"函数调用"之间的区别 "消息结 ...
- 一次Commons-HttpClient的BindException排查
线上有个老应用,在流量增长的时候,HttpClient抛出了BindException.部分的StackTrace信息如下: java.net.BindException: Address alrea ...
- [MVC]自定义模型绑定器,从表单对模型进行赋值
一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...
- .net core 3.0 WPF中使用FolderBrowserDialog
前言 随着.net core 3.0 的发布,WPF 也可以在 core 平台上使用了.当前的 WPF 不支持跨平台,仅能够在 Windows 平台上使用.如果想体验 WPF 跨平台开发,可以访问开源 ...
- Java8新特性之Lambda
为什么要Lambda Java8应该是目前最大的一次更新了,更新后我们迎来了很多新特性,其中便包括Lambda表达式,函数式编程的思想正式进入Java,让我们看一个经典案例. 例1 按照两个人的年龄排 ...
- (19)ASP.NET Core EF创建模型(包含属性和排除属性、主键、生成的值)
1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方法,这两种方法 ...
- CSS中各种布局的背后(*FC)
CSS中各种布局的背后,实质上是各种*FC的组合.CSS2.1中只有BFC和IFC,CSS3 中还增加了FFC和GFC. 盒模型(BoxModel) 上图为W3C标准盒模型,另外还有一种IE盒模型(I ...