洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树
正解:左偏树
解题报告:
开始看到的时候$jio$得长得很像之前做的一个$dp$,,,
但是$dp$那题是说不严格这里是严格?
不难想到我们可以让$a_{i},b_{i}$同时减去$i$这样就变成那道题辣,,,?$QwQ$
但是如果$dp$的话复杂度是$O(n^2)$的就假了$QwQ$
这里介绍一个左偏树做法,复杂度是$O(nlogn)$的$QwQ$
先考虑两个特殊情况,分别是$a$递减和$a$递增$QwQ$?
递增很显然就$b_{i}=a_{i}$就成$QwQ$
然后如果是递减,小学奥数得当$b$为中位数时有$min$
然后现在考虑把$a$拆成若干个区间,考虑怎么合并$QwQ$
假如现在要合并的区间的$b$分别是$b_{1},b_{2}$
如果$b_{1}\leq b_{2}$,欧克直接合并就成
否则就考虑继续找中位数?
所以现在就变成了动态维护中位数$QwQ$
这个似乎在基础算法里港过?就说开两个堆然后不停地$push\ pop$就好$QwQ$
但是这题里面是要合并的嘛,所以就用左偏树就成?
具体来说就考虑,对长度为$x$的序列,就把前$\frac{x}{2}$小的数放到左偏树里面,每次合并就合并两个左偏树,中位数就是堆顶
$umm$然后其实我$jio$得代码实现还是有点儿难度的,,,?
所以我我我我给$code$里打了点儿注释$w$
然后记得开$ll$,,,$100pts->10pts$真的很难受,,,$QwQQQQQQ$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define mp make_pair
#define gc getchar()
#define P pair<int,int>
#define ri register int
#define rc register char
#define rb register bool
#define t(i) edge[i].to
#define t_nw(i) edge_nw[i].to
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt)
#define e_nw(i,x) for(ri i=head_nw[x];i;i=edge_nw[i].nxt) const int N=+;
int n,a[N],tp[N],ed[N],top,ls[N],rs[N],dis[N],as;//tp是堆顶ed是范围 il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch<'' || ch>''))ch=gc;
if(ch=='-')ch=gc,y=;
while(''<=ch && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
int merg(ri x,ri y)
{
if(!x || !y)return x|y;
if(a[x]<a[y])swap(x,y);
rs[x]=merg(rs[x],y);if(dis[ls[x]]<dis[rs[x]])swap(ls[x],rs[x]);
dis[x]=dis[rs[x]]+;return x;
} signed main()
{
//freopen("4331.in","r",stdin);freopen("4331.out","w",stdout);
n=read();rp(i,,n)a[i]=read()-i;
rp(i,,n)
{
tp[++top]=i;ed[top]=i;
while(top> && a[tp[top]]<a[tp[top-]])
{
--top;tp[top]=merg(tp[top],tp[top+]);
if((ed[top+]-ed[top])& && (ed[top]-ed[top-])&)tp[top]=merg(ls[tp[top]],rs[tp[top]]);//可以用前面动态维护中位数的思考,就这个可并堆记的都只有1/2的小的那一半数嘛,然后如果合并的两个堆都是奇数,合并之后就会是偶数,就会要把最大的那个数弹到存大的那一半数的堆.因为这里并没开这个堆所以直接弹掉就成QwQ
ed[top]=ed[top+];
}
}
rp(i,,top)rp(j,ed[i-]+,ed[i])as+=abs(a[tp[i]]-a[j]);
printf("%lld\n",as);
rp(i,,top)rp(j,ed[i-]+,ed[i])printf("%lld ",a[tp[i]]+j);
return ;
}
洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树的更多相关文章
- 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]
题目传送门 数字序列 题目描述 给定一个整数序列 a1,a2,⋅⋅⋅,an ,求出一个递增序列 b1<b2<⋅⋅⋅<bn ,使得序列 ai 和 bi 的各项之差的绝对 ...
- Luogu P4331 [BOI2004]Sequence 数字序列 (左偏树论文题)
清晰明了%%% Fairycastle的博客 个人习惯把size什么的存在左偏树结点内,这样在外面好写,在里面就是模板(只用修改update). 可以对比一下代码(好像也差不多-) MY CODE # ...
- 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)
传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...
- 洛谷P4331[BOI2004] sequence
博客复活? 这个题很模板啊.随便上个左偏树.之前第一遍写对了.然后今天翻出来又写了一遍发现了一个奇奇怪怪的问题. 对比如下 上面的是AC 下面的WA 真的是一个很蠢的问题...你TM堆顶都弹出来了,堆 ...
- 洛谷.3273.[SCOI2011]棘手的操作(左偏树)
题目链接 还是80分,不是很懂. /* 七个操作(用左偏树)(t2表示第二棵子树): 1.合并:直接合并(需要将一个t2中原有的根节点删掉) 2.单点加:把这个点从它的堆里删了,加了再插入回去(有负数 ...
- 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]
题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...
- 洛谷P3066 [USACO12DEC] 逃跑的Barn [左偏树]
题目传送门 逃跑的Barn 题目描述 It's milking time at Farmer John's farm, but the cows have all run away! Farmer J ...
- 模板 可并堆【洛谷P3377】 【模板】左偏树(可并堆)
P3377 [模板]左偏树(可并堆) 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删 ...
- P4331 [BOI2004]Sequence 数字序列 (左偏树)
[题目链接] https://www.luogu.org/problemnew/show/P4331 题目描述 给定一个整数序列\(a_1, a_2, ··· , a_n,\)求出一个递增序列\(b_ ...
随机推荐
- zip解决杨辉三角问题
杨辉三角原型: / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ 实现: a = [1] while True: print(a) ...
- Python copy(), deepcopy()
copy() 浅拷贝: 创建一组拷贝对象的引用.切片操作相当于浅拷贝,会生成一个新的对象,新的对象里保存原对象的引用. 如果原对象中的可变对象改变(list),那么浅拷贝的对象随之改变,如果原对象中不 ...
- HSV 和 HLS颜色空间
颜色空间 颜色空间是特定的颜色组织:它提供了将颜色分类,并以数字图像表示的方法. RGB 是红绿蓝颜色空间.你可以将其视为 3D 空间,在这种情况下是立方体,其中任何颜色都可以用 R.G 和 B 值的 ...
- LOJ 10239 有趣的数列
LOJ 10239 有趣的数列 首先可以将奇数视作入栈,偶数视作出栈,那么它是卡特兰数,其实打表也能看出来,而且好像可以用dp? 不过这道题的难点不在这里,p不是素数,所以不能用求逆元来做,不过前50 ...
- 【Bzoj1875】HH去散步
[Bzoj1875]HH去散步 先说一下边点互化的思路(貌似这种题不多?),以后看见边数少的要死的记得想边点乎化,将无向边变成有向边在考虑边之间的可达性,如果边x的终点是边y的起点(前提不是同一条边) ...
- C++ 结构体的定义
struct 结构体名称{ 数据类型 A: 数据类型 B; }结构体变量名; 相当于: struct 结构体名称{ 数据类型 A: 数据类型 B; }; struct 结构体名 ...
- winform(C#)里弹出“确定”“取消”对话框
//消息框中需要显示哪些按钮,此处显示“确定”和“取消” MessageBoxButtons messButton = MessageBoxButtons.OKCancel; //"确定要退 ...
- Laravel 上传excel,读取并写入数据库 (实现自动建表、存记录值
<?php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminat ...
- webkit浏览器下多行显示,有省略号效果
多行显示情况 display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; ...
- 5分钟了解为什么学习Go
1.什么是Go语言? Google开源 编译型语言 21世纪的C语言(主流编程语言都是单线程环境下发布的) 2.Go语言的特点? 简单易学习(类似python学习难度,自带格式化) 开发效率高 执行性 ...