清晰明了%%% Fairycastle的博客

个人习惯把size什么的存在左偏树结点内,这样在外面好写,在里面就是模板(只用修改update).

可以对比一下代码(好像也差不多…)

MY CODE

#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000005;
struct lt {
int ls, rs, v, d, sz;
}t[MAXN];
int n, m, l[MAXN], r[MAXN], st[MAXN], a[MAXN], b[MAXN]; //st存栈内根节点编号
inline void upd(int x) {
if(t[t[x].ls].d < t[t[x].rs].d) swap(t[x].ls, t[x].rs);
t[x].d = t[t[x].rs].d + 1;
t[x].sz = t[t[x].ls].sz + t[t[x].rs].sz + 1;
}
int merge(int x, int y) {
if(!x || !y) return x + y;
if(t[y].v > t[x].v) swap(x, y);
t[x].rs = merge(t[x].rs, y);
upd(x);
return x;
}
inline int pop(int x) {
int l = t[x].ls, r = t[x].rs;
t[x].ls = t[x].rs = t[x].d = 0; t[x].sz = 1;
return merge(l, r);
}
int main () {
t[0].d = -1;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), a[i] -= i;
for(int i = 1; i <= n; ++i) {
st[++m] = i; l[m] = r[m] = i;
t[i] = (lt) { 0, 0, a[i], 0, 1 };
while(m > 1 && t[st[m-1]].v > t[st[m]].v) {
--m;
st[m] = merge(st[m], st[m+1]);
r[m] = r[m+1];
while(t[st[m]].sz<<1 > r[m]-l[m]+2)
st[m] = pop(st[m]);
}
}
long long ans = 0;
for(int i = 1; i <= m; ++i)
for(int j = l[i]; j <= r[i]; ++j)
ans += abs(a[j]-(b[j]=t[st[i]].v));
printf("%lld\n", ans);
for(int i = 1; i <= n; ++i) printf("%d ", b[i] + i);
}

Other CODE

#include<bits/stdc++.h>
#define ll long long
#define in inline
#define rint register int
#define N 1000010
using namespace std;
int n,m;
int d[N],ls[N],rs[N];
ll a[N],b[N],ans;
struct node{
int rt,l,r,siz;
ll w;
}s[N];
in ll read()
{
ll x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
return x*f;
}
in int merge(int x,int y)
{
if(x==0||y==0) return x+y;
if(a[x]<a[y]) swap(x,y);
rs[x]=merge(rs[x],y);
if(d[ls[x]]<d[rs[x]]) swap(ls[x],rs[x]);
d[x]=d[rs[x]]+1;
return x;
}
in void work()
{
for(rint i=1;i<=n;i++)
{
s[++m]=(node) { i,i,i,1,a[i] };
while(m>1&&s[m].w<s[m-1].w)
{
m--;
s[m].rt=merge(s[m].rt,s[m+1].rt);
s[m].siz+=s[m+1].siz;
s[m].r=s[m+1].r;
while(s[m].siz>(s[m].r-s[m].l+1+2)>>1)//向上取整
{
s[m].siz--;
s[m].rt=merge(ls[s[m].rt],rs[s[m].rt]);
}
s[m].w=a[s[m].rt];
}
}
for(rint i=1;i<=m;i++)
for(rint j=s[i].l;j<=s[i].r;j++)
b[j]=s[i].w,ans+=abs(a[j]-b[j]);
}
int main()
{
d[0]=-1; n=read();
for(rint i=1;i<=n;i++) a[i]=read()-i;
work();
printf("%lld\n",ans);
for(rint i=1;i<=n;i++) printf("%lld ",b[i]+i);
return 0;
}

Luogu P4331 [BOI2004]Sequence 数字序列 (左偏树论文题)的更多相关文章

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

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

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

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

  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. [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. luoguP4331 [BOI2004]Sequence 数字序列

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

  8. HDU 1512 Monkey King(左偏树模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1512 题意: 有n只猴子,每只猴子一开始有个力量值,并且互相不认识,现有每次有两只猴子要决斗,如果认识,就不打了 ...

  9. BZOJ 2809: [Apio2012]dispatching(可并堆 左偏树板题)

    这道题只要读懂题目一切好说. 给出nnn个点的一棵树,每一个点有一个费用vvv和一个领导力aaa,给出费用上限mmm.求下面这个式子的最大值ax∗∣S∣ ( S⊂x的子树, ∑iv[i]≤m )\la ...

随机推荐

  1. Spring之一:IoC容器体系结构

    温故而知心. Spring IoC概述 常说spring的控制反转(依赖反转),看看维基百科的解释: 如果合作对象的引用或依赖关系的管理要由具体对象来完成,会导致代码的高度耦合和可测试性降低,这对复杂 ...

  2. SQL SERVER DATEADD函数

    定义: DATEADD() 函数在日期中加上指定的时间间隔. ※指定的时间间隔可以为负数 语法: DATEADD(datepart,number,date) 参数: ①datepart 参数可以是下列 ...

  3. SQL Server 数据备份存储过程

    原文:SQL Server 数据备份存储过程 今天开园,分享一下我一直在使用的数据备份存储过程,欢迎转载!!! ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  4. Linux系列(3):入门之正确的关机方法

    前言:在Windows(非NT主机系统)系统中,由于是单人假多任务的情况,所以即使你计算机关机,对于别人也没有丝毫影响!不过,在Linux下面,由于每个程序(或者服务)都是在在背景下执行,因此,在看不 ...

  5. Keepalive+双主

    一.建立3台服务器之间ssh互信在mydb1,mydb2,mydb3服务器上分别执行:ssh-keygen -t rsassh-copy-id -i .ssh/id_rsa.pub root@192. ...

  6. Spring实战(六)自动装配的歧义性

    1.Spring进行自动装配时碰到的bean歧义性问题. 在进行自动装配时,只有仅有一个bean匹配所需结果时,才是可行的. 如果不仅仅一个bean能够匹配结果,例如一个接口有多个实现,这种歧义性会阻 ...

  7. 怎样安装 cnpm 并切换到淘宝镜像?

    如果不使用 vpn , 在国内直接使用 npm 的官方镜像会很慢,这里推荐使用淘宝 NPM 镜像.淘宝 NPM 镜像是一个完整的 npmjs.org 镜像,可以用此代替官方版本(只读). 操作方法如下 ...

  8. 19-Perl 特殊变量

    1.Perl 特殊变量Perl 语言中定义了一些特殊的变量,通常以 $, @, 或 % 作为前缀,例如:$_.很多特殊的变量有一个很长的英文名,操作系统变量 $! 可以写为 $OS_ERROR.如果你 ...

  9. ubuntu18.04安装fcitx

    fcitx安装比较麻烦,我每次安装都要费不少劲,每次装安之后都没有写日志记录下来,导致下次装的时候又手忙脚乱,所以这次一定要记录下来. 前因: 我本来用的是ibus,但是这个输入法好像有bug,我在编 ...

  10. vue2-editor使用

      <template> <div class="wrapper wrapper-content" id="notes" v-cloak> ...