LINK:数字序列

这是一道论文题 我去看了一眼论文鸽的论文。

发现讲的还算能懂。可并堆的操作也讲的比较清晰。

对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组就可以不需要满足严格递增的条件了只要不降即可。

这样更有利于我们继续的思考 此时对于a序列单调不降的时候 显然a序列本身即是答案。

而对于a序列单调不升的时候 根据小学奥数 可以的出此时b为序列的中位数最优。

具体证明是这样的b序列完全小于a序列 b序列完全大于a序列 b序列先小于后大于a序列。

显然第三种情况代价<=前两种代价。

考虑在完成交叉的时候 \(b_k==a_k\)时此时最优。

所以可以证明 此时至少有一个位置 \(a_k==b_k\) 此时考虑k左边元素\(a_{k-1}\geq a_k\)

\(b_{k-1}\leq b_k\) 可以发现此时\(b_{k-1}\)取\(b_k\)最优。

而k右边元素同理。

当我们把k的位置移到最中间的时候可以发现是最优的 所以上述小学奥数成立。

依照这个思路我们可以发现 把序列分段 让每一段单调的是最优的即可。

假设现在有两端 其序列的最优值分别为x1 x2 x1>=x2 我们考虑此时将序列进行合并。

因为这两段不可能同时最优了 所以将其当成一段来解决。

他们同时也不满足不降 所以 按照第二种策略解决即可。

所以这道题变成了合并两个区间的数字并找出中位数 可以采用主席树 当然更快的还是可并堆。

const int MAXN=1000010;
int n,top;
int c[MAXN][2],d[MAXN],a[MAXN],b[MAXN];
ll ans;
struct wy
{
int l,r,rt;
int v,sz;
}s[MAXN];
inline int merge(int x,int y)
{
if(!x||!y)return x|y;
if(a[x]<a[y])swap(x,y);
c[x][1]=merge(c[x][1],y);
if(d[c[x][1]]>d[c[x][0]])swap(c[x][0],c[x][1]);
d[x]=d[c[x][1]]+1;
return x;
}
int main()
{
freopen("1.in","r",stdin);
get(n);rep(1,n,i)get(a[i]),a[i]-=i;
rep(1,n,i)
{
s[++top]=(wy){i,i,i,a[i],1};
while(top>1&&s[top].v<s[top-1].v)
{
s[top-1].rt=merge(s[top].rt,s[top-1].rt);
s[top-1].r=s[top].r;s[top-1].sz+=s[top].sz;
--top;int sz=s[top].r-s[top].l+1;
while(s[top].sz>sz/2+(sz&1))
{
s[top].rt=merge(c[s[top].rt][0],c[s[top].rt][1]);
--s[top].sz;
}
s[top].v=a[s[top].rt];
}
}
int flag=1;
rep(1,n,i)
{
if(s[flag].r<i)++flag;
ans+=abs(a[i]-a[s[flag].rt]);
b[i]=a[s[flag].rt];
}
printf("%lld\n",ans);
rep(1,n,i)printf("%d ",b[i]+i);
return 0;
}

luogu 4331 [BalticOI 2004]Sequence 数字序列的更多相关文章

  1. 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]

    题目传送门 数字序列 题目描述 给定一个整数序列 a1​,a2​,⋅⋅⋅,an​ ,求出一个递增序列 b1​<b2​<⋅⋅⋅<bn​ ,使得序列 ai​ 和 bi​ 的各项之差的绝对 ...

  2. Luogu P4331 [BOI2004]Sequence 数字序列 (左偏树论文题)

    清晰明了%%% Fairycastle的博客 个人习惯把size什么的存在左偏树结点内,这样在外面好写,在里面就是模板(只用修改update). 可以对比一下代码(好像也差不多-) MY CODE # ...

  3. P4331 [BOI2004]Sequence 数字序列 (左偏树)

    [题目链接] https://www.luogu.org/problemnew/show/P4331 题目描述 给定一个整数序列\(a_1, a_2, ··· , a_n,\)求出一个递增序列\(b_ ...

  4. 洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树

    正解:左偏树 解题报告: 传送门$QwQ$ 开始看到的时候$jio$得长得很像之前做的一个$dp$,,, 但是$dp$那题是说不严格这里是严格? 不难想到我们可以让$a_{i},b_{i}$同时减去$ ...

  5. [BOI2004]Sequence 数字序列(左偏树)

    PS:参考了黄源河的论文<左偏树的特点及其应用> 题目描述:给定一个整数序列\(a_1, a_2, - , a_n\),求一个递增序列\(b_1 < b_2 < - < ...

  6. [BOI2004]Sequence 数字序列

    Description: Hint: \(n<=10^5\) Solution: 首先考虑b不严格递增时的做法 发现当\(a[i]\)递增时\(b[i]\)直接取\(a[i]\)即可,否则此时需 ...

  7. 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)

    传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...

  8. luoguP4331 [BOI2004]Sequence 数字序列

    题意 大力猜结论. 首先将所有\(a_i\)变为\(a_i-i\),之后求不严格递增的\(b_i\),显然答案不变,最后\(b_i\)加上\(i\)即可. 考虑两种特殊情况: 1.\(a[]\)是递增 ...

  9. 2021.08.01 P4311 数字序列(左偏树)

    2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...

随机推荐

  1. POJ - 3463 Sightseeing 最短路计数+次短路计数

    F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...

  2. JVM零碎知识

    JVM常见XX参数 查看JVM默认值 常用基本配置参数 生产环境服务器变慢,如何诊断 生产环境CPU占用过高,如何诊断 JDK自带的JVM监控和性能分析工具 jps(虚拟机进程状况工具) jinfo( ...

  3. Sql Or NoSql,看完这一篇你就懂了(转五月的仓颉)

    前言 你是否在为系统的数据库来一波大流量就几乎打满CPU,日常CPU居高不下烦恼?你是否在各种NoSql间纠结不定,到底该选用那种最好?今天的你就是昨天的我,这也是写这篇文章的初衷. 这篇文章是我好几 ...

  4. 数据可视化之powerBI技巧(二十四)Power BI初学者刚见的错误,帮你轻松处理

    在学习PowerBI的过程中,尤其是刚接触的时候,不可避免的会遇到各种各样的错误,有时自己怎么检查都没法消除,不解决这个错误又没法进行下一步的工作,经常会搞的自己烦闷无比,不过最后通过自己的苦苦摸索. ...

  5. python 装饰器(二):装饰器基础(二)变量作用域规则,闭包,nonlocal声明

    变量作用域规则 在示例 7-4 中,我们定义并测试了一个函数,它读取两个变量的值:一个是局部变量 a,是函数的参数:另一个是变量 b,这个函数没有定义它. >>> def f1(a) ...

  6. redis(二):Redis 命令

    Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 语法 Redis 客 ...

  7. Hadoop进阶命令使用介绍

    hadoop生产环境的使用是很复杂的,有些公司是CDH或者Ambari等管理工具运维的,有些是原生的集群俗称裸奔,前者优缺点是运维,查看监控等容易,对于底层理解不友好:裸奔集群反之,裸奔集群的很多东西 ...

  8. 【学习记录】C#保存数据至CSV文档 & DateTime格式模式控制解释

    数据类的定义: public class Result_Display { private string id; public string ID { get { return id; } set { ...

  9. 从连接器组件看Tomcat的线程模型——连接器简介

    Connector组件介绍 Connector(连接器)组件是Tomcat最核心的两个组件之一,主要的职责是负责接收客户端连接和客户端请求的处理加工.每个Connector都将指定一个端口进行监听,分 ...

  10. 毕业三年从月薪6K到20K

    首先,声明这不是标题党,是一个真实的北漂故事!     为什么写这篇文章呢?第一,有感而发,感恩遇到的人和事,其次,希望对读这篇文章的你有所帮助 毕业那年 时间追溯到17年6月30号,那天毕业典礼,之 ...