题目描述

Bessie把快速排序和冒泡排序混在了一起

给一个伪快排的代码:

冒泡:

bubble_sort_pass (A) {
for i = to length(A)-
if A[i] > A[i+], swap A[i] and A[i+]
}

“快排”:

quickish_sort (A) {
if length(A) = , return
do { // Main loop
work_counter = work_counter + length(A)
bubble_sort_pass(A)
} while (no partition points exist in A)
divide A at all partition points; recursively quickish_sort each piece
}

代码解释:

设大小为i的数为ai,定义i是分割点,当且仅当当前序列中,小于ai的数都在i左边,大于ai的数都在i右边。

每一次对于当前层的当前区间进行冒泡排序。

直到找到 一个这样的分割点为止。(一次性可能出来多个)

然后对与每个分割点分割成若干个小区间。递归下去。

A长度为1的时候,直接返回

work_counter是一个计数器。

题目给一个序列,求排好序,计数器的值是多少。

n<=100000,ai<=1e9

题解:

发现分割点的定义和上一个题的最后排序停止的条件很类似。

还是考虑什么时候排序会停止。

也就是所有的 位置i都是分割点了。

直接算A长度不好算。

那么就算每个位置i一共被加了几次。

设t[i]表示i位置出现分割点的时间(即i位置已经被算了几次)

这里,i是n+1个端点编号了注意。

那么,位置i计算的次数,就是max(t[i],t[i+1])

所有位置计算次数的和就是ans

ti怎么算

发现对于这个一般的冒泡排序,上一个题也说了

i之后比i小的数会以每次1个单位的速度往i走。

所以,i位置出现分割点的时间,必然是最晚的i之后的数到达i的次数。

其实每一次循环,因为最大数会沉底,那么一次就会出现至少一个分割点的。然后就break递归下去了

而每一次,位置i前面一个格子的长度会被算一次,i后面一个格子长度会被算一次。

那么,t[i]也就是i格子或者i+1格子的至少的贡献了。

具体来说,离散化之后,求所有的小于等于i的数到i的距离(i位置之前的不算)。

用一个变量记录maxpos即可。

对于数字a,b相同?

那么,靠后的数字b,最终一定在a的后面。就相当于b比a大了。

所以可以在离散化的时候不要unique,然后开一个桶,记录出现次数即可。

O(n)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=+;
int n;
int a[N],b[N],p[N];
int cnt[N];
int tim[N];
long long ans;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+n+);
for(int i=;i<=n;i++){
int t=lower_bound(b+,b+n+,a[i])-b;
int lp=t+cnt[t];
cnt[t]++;t=lp;
p[t]=i;
}
int maxpos=;
for(int i=;i<=n;i++){
maxpos=max(maxpos,p[i]);
tim[i]=max(,maxpos-i);
}
for(int i=;i<=n;i++){
ans+=max(tim[i],tim[i-]);
}printf("%lld",ans);return ;
}

[USACO18OPEN]Out of Sorts P 冒泡排序理解之二的更多相关文章

  1. [USACO18OPEN]Out of Sorts G 冒泡排序理解之一

    题目描述 给一个双向冒泡排序的程序: moo表示输出moo sorted = false while (not sorted): sorted = true moo to N-: ] < A[i ...

  2. 深入理解OOP(二):多态和继承(继承)

    本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...

  3. C++ 中类的构造函数理解(二)

    C++ 中类的构造函数理解(二) 写在前面 上次的笔记中简要的探索了一下C++中类的构造函数的一些特性,这篇笔记将做进一步的探索.主要是复制构造函数的使用. 复制构造函数 复制构造函数也称拷贝构造函数 ...

  4. ppp 完全理解(二)【转】

    转自:https://blog.csdn.net/tianruxishui/article/details/44057717 ppp 完全理解(二) pppd 协议及代码分析 作者:李圳均 日期:20 ...

  5. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  6. 洛谷 P4375 [USACO18OPEN]Out of Sorts G(树状数组求冒泡排序循环次数加强版)

    传送门:Problem 4375 参考资料: [1]:https://www.cnblogs.com/Miracevin/p/9662350.html [2]:https://blog.csdn.ne ...

  7. 洛谷 P4378 [USACO18OPEN]Out of Sorts S(树状数组求冒泡排序循环次数)

    传送门:Problem P4378 https://www.cnblogs.com/violet-acmer/p/9833502.html 要回宿舍休息了,题解明天再补吧. 题解: 定义一数组 a[m ...

  8. bzoj 5277: [Usaco2018 Open]Out of Sorts【冒泡排序瞎搞】

    首先考虑快排的递归什么时候停下,显然是当前段只剩下一个数了,也就是一个数两边出现分隔符 然后再考虑计算冒泡长度这个操作,因为有分割,所以我们可以把这些放到一起冒泡,这和递归每个区间冒泡是等价的 所以答 ...

  9. C++入门到理解阶段二基础篇(8)——C++指针

    1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...

随机推荐

  1. Binary Tree的3种非Recursive遍历

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  2. Appengine直接下载文件并保存到google drive

    一直对下载文件比较感兴趣.前些日子无意搜到google 推出一项服务,可以直接将文件下载到google drive中,原型猛戳这里,但有限额限制.一时脑洞大开,可不可以在appengine 上架设服务 ...

  3. oAuth2.0在laravel5.2中的简单应用

    oAuth是一个关于授权的开放网络标准,目前的版本是2.0.laravel是php开发框架,目前最新稳定版本是5.5.授权在应用程序中有非常广泛的使用场景,本文将以laravel5.2为例来简单介绍o ...

  4. Visual Studio AI配置环境

    参考链接:http://www.cnblogs.com/ms-uap/p/9123033.html 背景: 1.能联网的电脑:Win7 64 SP1 2.鼠标.键盘.显示器好使 3.已安装VS2010 ...

  5. Daily Scrum (2015/10/29)

    今天晚上我们学霸项目的三个小组在一起开会,讨论如何能在后期使我们三个项目更好地结合在一起.为了三个小组的能够同时工作,不出现某一小组因需要其他小组成果而停滞的情况,我们决定围绕lucene,solr, ...

  6. 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...

  7. 软工1816 · Beta冲刺(6/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进Web端完成开发 推进修改一些后端接口的逻辑 着手制作视频 接下来的计划 ...

  8. object-oriented first work

    前言:在星期三的第一次面向对象程序设计课,遇见我们的栋哥,初次见面,发现老师的幽默.....下课后,就给我们一道作业题目... 作业要求:Create a program that asks for ...

  9. 【CSAPP笔记】3. 浮点数

    回想起刚学C语言时,我对浮点数的印象大概是"能够表示小数"的数据类型.还死记硬背过例如什么"小数用double存,用%f输出"这类的话.实际上呢,浮点数可以用这 ...

  10. elasticsearch文档-字段的mapping

    mapping == Mapping是指定义如何将document映射到搜索引擎的过程,比如一个字段是否可以查询以及如何分词等,一个索引可以存储含有不同"mapping types" ...