[USACO18OPEN]Out of Sorts P 冒泡排序理解之二
题目描述
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 冒泡排序理解之二的更多相关文章
- [USACO18OPEN]Out of Sorts G 冒泡排序理解之一
题目描述 给一个双向冒泡排序的程序: moo表示输出moo sorted = false while (not sorted): sorted = true moo to N-: ] < A[i ...
- 深入理解OOP(二):多态和继承(继承)
本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...
- C++ 中类的构造函数理解(二)
C++ 中类的构造函数理解(二) 写在前面 上次的笔记中简要的探索了一下C++中类的构造函数的一些特性,这篇笔记将做进一步的探索.主要是复制构造函数的使用. 复制构造函数 复制构造函数也称拷贝构造函数 ...
- ppp 完全理解(二)【转】
转自:https://blog.csdn.net/tianruxishui/article/details/44057717 ppp 完全理解(二) pppd 协议及代码分析 作者:李圳均 日期:20 ...
- Java 反射理解(二)-- 动态加载类
Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...
- 洛谷 P4375 [USACO18OPEN]Out of Sorts G(树状数组求冒泡排序循环次数加强版)
传送门:Problem 4375 参考资料: [1]:https://www.cnblogs.com/Miracevin/p/9662350.html [2]:https://blog.csdn.ne ...
- 洛谷 P4378 [USACO18OPEN]Out of Sorts S(树状数组求冒泡排序循环次数)
传送门:Problem P4378 https://www.cnblogs.com/violet-acmer/p/9833502.html 要回宿舍休息了,题解明天再补吧. 题解: 定义一数组 a[m ...
- bzoj 5277: [Usaco2018 Open]Out of Sorts【冒泡排序瞎搞】
首先考虑快排的递归什么时候停下,显然是当前段只剩下一个数了,也就是一个数两边出现分隔符 然后再考虑计算冒泡长度这个操作,因为有分割,所以我们可以把这些放到一起冒泡,这和递归每个区间冒泡是等价的 所以答 ...
- C++入门到理解阶段二基础篇(8)——C++指针
1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...
随机推荐
- 【机器学习】无监督学习Autoencoder和VAE
众所周知,机器学习的训练数据之所以非常昂贵,是因为需要大量人工标注数据. autoencoder可以输入数据和输出数据维度相同,这样测试数据匹配时和训练数据的输出端直接匹配,从而实现无监督训练的效果. ...
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
中文题,题意就不说了 一开始接触树状数组时,只知道“单点更新,区间求和”的功能,没想到还有“区间更新,单点查询”的作用. 树状数组有两种用途(以一维树状数组举例): 1.单点更新,区间查询(即求和) ...
- #1490 : Tree Restoration-(微软2017在线笔试)
输入n m km个数,表示每层的节点个数接下来m行是每层的节点,节点顺序是从左往右的k个叶子节点k*k个矩阵,表示叶子节点之间的距离 输出:每个节点的父亲节点编号,root节点是0 题解:1.很明显, ...
- “秒杀”问题的数据库和SQL设计【转载】
“秒杀”问题的数据库和SQL设计 APRIL 21ST, 2015 问题的来源 完全不考虑一致性的方案 表结构 方案 存在的问题 保证单用户不会重复购买 解决超卖问题 方案 优化 提高性能了 鱼与熊掌 ...
- TeamWork#3,Week5,Scrum Meeting 11.9
由于经验不足和储备知识不够,最近我们的项目遇到了一些技术问题,需要对项目进行重新计划.我们总结了经验教训,找出了问题所在,明确了要补充的知识,加紧学习,将会在一周之内解决相关问题. 成员 已完成 待完 ...
- VANET
VANET知识 VANET与普通网络相比,与IOV的区别: VANET中Greedy Routing:基于距离(GPSR):基于速度和角度:基于道路层(TDR): Repair Strategy:Fa ...
- 理解jquery on 委托事件的机制
前两天做了一个点击任意位置,都能关闭菜单的功能,因为菜单里面的每一个a,的点击事件都是用on绑定的.所以在阻止冒泡的时候不管用,今天特意来理解一下on的机制 on 是委托事件,利用的就是冒泡原理 $( ...
- Beta阶段DAY3
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:尝试改进UI,美化界面. 林庭亦:调整难度设置. 郑子熙:尝试改进UI,美化界面. 陈文俊:调整难度设置. 2 ...
- 实测 | 转型微服务,这4大工具谁是API网关性能最优?
转自:http://www.servicemesh.cn/?/article/45 作者:Turgay Çelik 翻译:钟毅(Drew Zhong) 原文:Comparing API Gateway ...
- [转帖]CentOS基础命令大全
https://www.toutiao.com/i6601298434651587085/ 1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init ...