[BOI2004]Sequence 数字序列
Description:

Hint:
\(n<=10^5\)
Solution:
首先考虑b不严格递增时的做法
发现当\(a[i]\)递增时\(b[i]\)直接取\(a[i]\)即可,否则此时需要对之前的答案和现在的答案取中位数
如果做中位数操作之后还是小于前面的答案,就一直取中位数
最后会得到许多段值递增的区间,每一段区间里的数都对应这个答案
至于题目要求的严格递增,输入\(a\)序列时每个数减去其下标,输出答案时加回来即可
由于本题需要动态地向合并序列的中位数,故采用左偏树实现
#include<bits/stdc++.h>
using namespace std;
const int mxn=1e6+5;
int n,l[mxn],r[mxn],tot[mxn],a[mxn],b[mxn],sz[mxn],dis[mxn]={-1},ch[mxn][2],val[mxn],rt[mxn];
namespace Heap {
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);
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
if(dis[ch[x][1]]>dis[ch[x][0]])
swap(ch[x][0],ch[x][1]);
dis[x]=dis[ch[x][1]]+1;
return x;
}
}
using namespace Heap;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",val+i),val[i]-=i;
int now=0;
for(int i=1;i<=n;++i) {
++now; l[now]=r[now]=rt[now]=i;
tot[now]=sz[rt[now]]=1;
while(now>1&&val[rt[now-1]]>val[rt[now]]) {
--now; r[now]=r[now+1],tot[now]+=tot[now+1];
rt[now]=merge(rt[now],rt[now+1]);
while(sz[rt[now]]*2>tot[now]+1)
rt[now]=merge(ch[rt[now]][0],ch[rt[now]][1]);
}
}
long long ans=0;
for(int i=1;i<=now;++i)
for(int j=l[i];j<=r[i];++j)
ans+=1ll*abs(val[rt[i]]-val[j]);
printf("%lld\n",ans);
for(int i=1;i<=now;++i)
for(int j=l[i];j<=r[i];++j)
printf("%d ",val[rt[i]]+j);
return 0;
}
[BOI2004]Sequence 数字序列的更多相关文章
- 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]
题目传送门 数字序列 题目描述 给定一个整数序列 a1,a2,⋅⋅⋅,an ,求出一个递增序列 b1<b2<⋅⋅⋅<bn ,使得序列 ai 和 bi 的各项之差的绝对 ...
- [BOI2004]Sequence 数字序列(左偏树)
PS:参考了黄源河的论文<左偏树的特点及其应用> 题目描述:给定一个整数序列\(a_1, a_2, - , a_n\),求一个递增序列\(b_1 < b_2 < - < ...
- P4331 [BOI2004]Sequence 数字序列 (左偏树)
[题目链接] https://www.luogu.org/problemnew/show/P4331 题目描述 给定一个整数序列\(a_1, a_2, ··· , a_n,\)求出一个递增序列\(b_ ...
- 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)
传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...
- 洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树
正解:左偏树 解题报告: 传送门$QwQ$ 开始看到的时候$jio$得长得很像之前做的一个$dp$,,, 但是$dp$那题是说不严格这里是严格? 不难想到我们可以让$a_{i},b_{i}$同时减去$ ...
- luoguP4331 [BOI2004]Sequence 数字序列
题意 大力猜结论. 首先将所有\(a_i\)变为\(a_i-i\),之后求不严格递增的\(b_i\),显然答案不变,最后\(b_i\)加上\(i\)即可. 考虑两种特殊情况: 1.\(a[]\)是递增 ...
- Luogu P4331 [BOI2004]Sequence 数字序列 (左偏树论文题)
清晰明了%%% Fairycastle的博客 个人习惯把size什么的存在左偏树结点内,这样在外面好写,在里面就是模板(只用修改update). 可以对比一下代码(好像也差不多-) MY CODE # ...
- luogu 4331 [BalticOI 2004]Sequence 数字序列
LINK:数字序列 这是一道论文题 我去看了一眼论文鸽的论文. 发现讲的还算能懂.可并堆的操作也讲的比较清晰. 对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组 ...
- 2021.08.01 P4311 数字序列(左偏树)
2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...
随机推荐
- mysql之 innobackupex备份+binlog日志的完全恢复【转】
前言: MySQL的完全恢复,我们可以借助于完整的 备份+binlog 来将数据库恢复到故障点. 备份可以是热备与逻辑备份(mysqldump),只要备份与binlog是完整的,都可以实现完全恢复. ...
- ORA-01017: invalid username/password; logon denied 解决方案
在SQLPLUS窗口下进行用户登录,出现ORA-01017:invalid username/password:logon denied .如下图: 在网上找了很久,发现一个实用的解决方案,操作如下: ...
- java web path
1,request.getRealPath("/");这个方法已不推荐用 2,在Servlet 里用this.getServletContext().getRealPath(&qu ...
- javaScript中自定义sort中的比较函数,用于比较字符串长度,数值大小
, 1.2, 'bb', 'cc']; var len = arr.length; // for (var i = 0; i < len; i++) { // alert(arr + &qu ...
- 基于Apache的阿里云部署Node.js服务器(Windows环境)
1 前言 由于nodejs项目对方开放了多个端口,而且阿里云上的Apache服务器(windows)已经挂载了网站,此时需要把此项目也挂上去,网上查询资料,方法略少,基本是基于nginx版本的. 2 ...
- php高级工程师面试题,行不行对照看下自己的实力
在网上看到一些高级php 的面试题目.. 最近接连面试了几家公司,有些重要问题记录一下,督促自己学习提高,同时希望给朋友们一些帮助.内容很多,一点点完善,一步步学习..有些是面试被问,有些是招聘要求, ...
- TCP/IP、Http大纲
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只 ...
- AlexNet
AlexNet学习笔记 目录 AlexNet整体结构 CNN 全连接 TensorFlow实现 AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevs ...
- pytest十二:cmd命令行参数
命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在 cmd 执行”pytest —html=report.html”,这里面的”—html=report.html“就是从命令行传入的参数对 ...
- Spring集成shiro做登陆认证
一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...