热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AcWing超快速排序

AcWing超快速排序Description在这个问题中,您必须分析特定的排序算法----超快速排序。该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序。

AcWing 超快速排序

Description

  • 在这个问题中,您必须分析特定的排序算法----超快速排序。

    该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序。

    对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 5 9

    您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。

Input

  • 输入包括一些测试用例。

    每个测试用例的第一行输入整数n,代表该用例中输入序列的长度。

    接下来n行每行输入一个整数ai,代表用例中输入序列的具体数据,第i行的数据代表序列中第i个数。当输入用例中包含的输入序列长度为0时,输入终止,该序列无需处理。

Output

  • 对于每个需要处理的输入序列,输出一个整数op,代表对给定输入序列进行排序所需的最小交换操作数,每个整数占一行。

Sample Input

5
9
1
0
5
4
3
1
2
3
0

Sample Output

6

0

Data Size

  • 0≤N<500000,
    0≤ai≤999999999

题解:

  • 交换相邻元素... ...这不就是冒泡排序的原理吗?
  • 那么,交换次数就是逆序对个数啊。yy一下很容易理解。
  • 我是用树状数组求逆序对。需要注意几点:
  1. 用树状数组一定要离散化... ...要不炸空间炸时间
  2. 如果有重复的数怎么办?没关系,有没有发现,更新的时候是+=1而不是=1
#include 
#include 
#include 
#include 
#define N 500005
#define lowbit(x) (x & (-x))
#define LL long long
using namespace std;

LL n, cnt, ans;
LL a[N], b[N], c[N];

LL read()
{
    LL x = 0; char c = getchar();
    while(c <'0' || c > '9') c = getchar();
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
    return x;
}

LL ask(LL pos)
{
    LL r = 0;
    while(pos >= 1)
    {
        r += c[pos];
        pos -= lowbit(pos);
    }
    return r;
}

void update(LL pos, LL val)
{
    while(pos <= n)
    {
        c[pos] += val;
        pos += lowbit(pos);
    }
}

LL find(LL x) {
    return lower_bound(b + 1, b + 1 + cnt, x) - b;
}

int main()
{
    while(scanf("%lld", &n) == 1)
    {
        if(!n) break;
        ans = cnt = 0;
        memset(c, 0, sizeof(c));
        for(LL i = 1; i <= n; i++) a[i] = read(), b[++cnt] = a[i];
        sort(b + 1, b + 1 + cnt);
        cnt = unique(b + 1, b + 1 + cnt) - b - 1;
        for(LL i = 1; i <= n; i++)
        {
            LL t = find(a[i]);
            update(t, 1);
            ans += (i - ask(t));
        }
        printf("%lld\n", ans);
    }
    return 0;
}

推荐阅读
  • Description“第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n\timesm\)矩阵。第二分钟,L说,要能修改,于是便有了将左上角为\((a,b)\) ... [详细]
  • 本文介绍了一个项目中如何在Windows平台上实现多声道音频数据的采集,特别是针对DANTE音频接口的8路立体声音频通道。文章详细描述了使用Windows底层音频API进行音频采集的方法,并提供了一个具体的实现示例。 ... [详细]
  • 本文探讨了C++编程语言中声明与定义的区别,以及如何通过内部连接和外部连接来组织源文件,确保代码的正确链接与编译。文章详细解析了不同类型、变量、函数以及类的连接属性,并提供了实用的示例。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ... [详细]
  • 辗转相减法在求解最大等比值问题中的应用
    本文探讨了如何利用辗转相减法解决X星球大奖赛中奖金分配的数学问题,通过分析给定的数据点,计算出可能的最大等比值。 ... [详细]
  • 1、字符型常量字符型常量指单个字符,是用一对单引号及其所括起来的字符表示。例如:‘A’、‘a’、‘0’、’$‘等都是字符型常量。C语言的字符使用的就是 ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
  • 本文介绍了一个使用 C++ 实现的进度条功能,通过自定义函数指针和控制台输出来展示任务完成的进度。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • 本文详细介绍了Java中的`ByteArrayInputStream`和`ByteArrayOutputStream`,包括它们的基本概念、工作原理及具体应用实例。`ByteArrayInputStream`用于处理内存中的字节数组,而`ByteArrayOutputStream`则用于将数据写入内存中的字节数组。 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • 本文介绍了一道来自《紫书》的编程题目——UVa11212 编辑书稿。该问题通过迭代加深搜索(IDA*)算法解决,旨在找到将给定排列转换为升序排列所需的最少步骤。文章提供了详细的解题思路和代码实现。 ... [详细]
  • 本文探讨了如何解决HAOI2007竞赛中的理想正方形问题。通过计算矩阵中每个N×N子矩阵的最大值和最小值,最终求得所有子矩阵中最大值与最小值差的最小值。 ... [详细]
author-avatar
无正道
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有