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 数字序列的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. luoguP4331 [BOI2004]Sequence 数字序列

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

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

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

  8. luogu 4331 [BalticOI 2004]Sequence 数字序列

    LINK:数字序列 这是一道论文题 我去看了一眼论文鸽的论文. 发现讲的还算能懂.可并堆的操作也讲的比较清晰. 对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组 ...

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

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

随机推荐

  1. Node.jsでMySQLを使うメモ

    インストール npm install mysql コネクション var mysql = require('mysql'); var connection = mysql.createConnectio ...

  2. 移动端rem单位适配使用

    1.适配方法 //缩放比例!function(e,t){function i(){o=1,e.devicePixelRatioValue=o,s=1/o;var t=a.createElement(& ...

  3. 研究slatstack时踩过的坑,注意点及解决方案

    运行问题 1.直接物理性移除minion或者更换minion原先连接的master,会导致先前的master始终无法ping通minion [root@localhost salt]# salt '* ...

  4. oracle 分区 查询

    显示数据库所有分区表的信息:DBA_PART_TABLES 显示当前用户可访问的所有分区表信息:ALL_PART_TABLES 显示当前用户所有分区表的信息:USER_PART_TABLES 显示表分 ...

  5. PYTHON-面向对象 类 绑定方法

    面向对象三大特性(*****) 1继承 1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承与现实生活中的继承一个意思 (例如 小明继承小明他爹 ...

  6. linux命令: chown命令

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  7. 2018-2019-2 网络对抗技术 20165333 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165333 Exp4 恶意代码分析 原理与实践说明 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或E ...

  8. 【C++ Primer 第15章】定义派生类析构函数

    学习资料 • 基类和派生类析构函数执行顺序 定义派生类析构函数 [注意]定义一个对象时先调用基类的构造函数.然后调用派生类的构造函数:析构的时候恰好相反:先调用派生类的析构函数.然后调用基类的析构函数 ...

  9. Hibernate之一级缓存和二级缓存

    1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...

  10. python爬取糗百内容

    #-*- coding: utf-8 -*- import urllib import urllib2 import re #页面为1 page=1 url='http://www.qiushibai ...