难得不是左偏树,而是思维;

这道题在做得时候,有两个性质

1.如果a是一个不下降序列,那么b[i]==a[i]时取得最优解。

2.如果a是一个严格递减序列,则取a序列的中位数x,令b[1]=b[2]=b[3]=...=b[n]=x,即是最优解。

于是在做得时候,我们会分为几个区间,通过区间得合并去做这一道题;

我们根据这两个性质,求出这些区间的最优质,去合并;

三.考虑一般情况

a序列一定不可能这么良心是上面的两种情况。

但它一定是由这两种情况组成的,也就是把a序列看成一段一段的,每一段要么不下降,要么严格递减。

那么要分别计算出每一段的答案是很容易的。

问题是要保证b序列不下降,所以该怎么合并答案呢?

这里又有一个结论:

把两段合在一起,取一个新的中位数就行了=。=

道理是同上的。

四.具体操作

1.初始令每一段的长度为1,令中位数为ci,则ci = ai,然后一段一段的合并起来。

若ci <= ci+1,那么就保持不变;否则将ci和ci+1所在的区间合并,取一个新的中位数,作为新区间的答案。

.........................................................................................................................................

2.这里会出现一个问题,就是第一次合并时,有可能ci+1>=ci,没有把两个区间并起来取中位数。

但是可能后面的那个区间又和其他区间合并了,中位数变小了,以至于还要和前一个区间合并。

其实很简单qwq,用栈维护一下就好了。

.........................................................................................................................................

3.那么问题来了,怎么求中位数呢?求了中位数还要把两段区间合并起来?

(下面一段话引用于某dalao博客)

因此我们需要一个数据结构,支持合并、查询最大值和删除。

为什么要查询最大值和删除呢?因为维护中位数可以只维护⌈1/2区间长度⌉小的数,用一个大根堆,则堆顶就是中位数。

合并完两个区间后,就一直删除堆顶,直到元素个数 = ⌈1/2区间长度⌉。

显然是用左偏树啦qwq。(参照别人博客)

 #include<cstdio>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
const ll maxn=1e6+;
ll val[maxn];
ll dis[maxn];
struct node{
ll rt,l,r,siz;
ll w;
}G[maxn]; ll num=;
ll ch[maxn][];
ll b[maxn];
ll Merge(ll x,ll y)
{
if(!x||!y) return x+y;
if(val[x]<val[y]) swap(x,y);
ch[x][]=Merge(ch[x][],y);
if(dis[ch[x][]]<dis[ch[x][]]) swap(ch[x][],ch[x][]);
dis[x]=dis[ch[x][]]+;
return x;
}
int main()
{
ll n;
scanf("%lld",&n);
for(ll i=;i<=n;i++){
scanf("%lld",&val[i]);
val[i]-=i;
}
for(ll i=;i<=n;i++){
G[++num]=(node) {i,i,i,,val[i] };
while(num>&&G[num].w<G[num-].w){
num--;
G[num].rt=Merge(G[num].rt,G[num+].rt);
G[num].siz+=G[num+].siz;
G[num].r=G[num+].r;
while(G[num].siz>(G[num].r-G[num].l++)>>){
G[num].siz--;
ll t=G[num].rt;
G[num].rt=Merge(ch[t][],ch[t][]);
}
G[num].w=val[G[num].rt];
}
}
ll ans=;
for(ll i=;i<=num;i++){
for(ll j=G[i].l;j<=G[i].r;j++){
b[j]=G[i].w;
ans+=fabs(val[j]-b[j]);
}
}
printf("%lld\n",ans);
for(ll i=;i<=n;i++){
printf("%lld ",b[i]+i);
}
return ;
}

左偏树(p4431)的更多相关文章

  1. BZOJ 1455 罗马游戏 ——左偏树

    [题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...

  2. 【BZOJ-1455】罗马游戏 可并堆 (左偏树)

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1355  Solved: 561[Submit][Status][Discuss] ...

  3. 【bzoj2809】[Apio2012]dispatching 左偏树

    2016-05-31  15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...

  4. zoj 2334 Monkey King/左偏树+并查集

    原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1389 大致题意:N只相互不认识的猴子(每只猴子有一个战斗力值) 两只 ...

  5. POJ3016-K-Monotonic(左偏树+DP)

    我觉得我要改一下签名了……怎么会有窝这么啰嗦的人呢? 做这题需要先学习左偏树<左偏树的特点及其应用> 然后做一下POJ3666,这题的简单版. 思路: 考虑一下维护中位数的过程原数组为A, ...

  6. POJ3666-Making the Grade(左偏树 or DP)

    左偏树 炒鸡棒的论文<左偏树的特点及其应用> 虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱…… 虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大 ...

  7. bzoj 1455: 罗马游戏 左偏树+并查集

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Descriptio ...

  8. 左偏树(Leftist Heap/Tree)简介及代码

    左偏树是一种常用的优先队列(堆)结构.与二叉堆相比,左偏树可以高效的实现两个堆的合并操作. 左偏树实现方便,编程复杂度低,而且有着不俗的效率表现. 它的一个常见应用就是与并查集结合使用.利用并查集确定 ...

  9. 黄源河《左偏树的应用》——数字序列(Baltic 2004)

    这道题哪里都找不到. [问题描述] 给定一个整数序列a1, a2, … , an,求一个不下降序列b1 ≤ b2 ≤ … ≤ bn,使得数列{ai}和{bi}的各项之差的绝对值之和 |a1 - b1| ...

随机推荐

  1. navicat异常 - 1130-host ... is not allowed to connect to this MySql server

    错误描述 用navicat连接数据库报错:1130-host ... is not allowed to connect to this MySql server如何处理 解决方案 1.连接服务器: ...

  2. 解决pjax重复加载js导致事件重复绑定的问题

    个人博客 地址:http://www.wenhaofan.com/article/20180925232057 1.所有js统一在pjax容器外引入 在pjax容器外引入的js只会被引入一次,所以不会 ...

  3. anki

    anki需要一个舞台来容纳所有的不同领域的经历 虽然难以避免臃肿的局面.

  4. 理解 Oracle 多租户体系中(12c,18c,19c)创建角色作用域范围

    本篇探讨以下几个问题:你可提前猜测下面6个场景语句中,哪几个可以成功创建角色? 1. 在CDB级别中创建公共角色,不带 container 子句的效果: 2. 在CDB级别中创建公共角色,带 cont ...

  5. 2级迁移类Q201-Oracle RAC 到单机RMAN迁移(同字节序)非公

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  6. 二分-C - Pie

    C - Pie My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a n ...

  7. 让Surface Shader不受光照的明暗影响

    直接上码 Shader "Custom/3DVideo" { Properties { _Color (,,,) _MainTex ("Albedo (RGB)" ...

  8. js中的闭包理解

    闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...

  9. python 处理protobuf协议

    背景:需要用django基于python3模拟一个http接口,请求是post方式,body是protobuf string,返回也是protobuf string 设计:django获取pb str ...

  10. 1052 Linked List Sorting (25分)

    题目 1. 思路 使用map存放所有的地址对 使用起始地址遍历map,结果存放在vector中 排序vector 输出vector 2. 注意点 开始的时候起始地址为-1 可能有些节点没有用到,注意排 ...