归并排序&&逆序对(codves1688,4163)

归并排序

归并排序采用的是分治的思想

1、划分问题:把序列分为元素个数尽量相等的两半

2、递归求解:把两半分别排序

3、合并问题:把两个有序的序列合并为一个

对于第三个问题,我们可以从两个序列中最小的元素开始比较,把较小的加入新的队列中,直到某个序列为空,把另外的一个序列直接加入,然后将原来的序列覆盖。其实很简单,下面看看模板代码

 写得烂,不要在意(⊙o⊙)…;

这个就是归并排序(⊙o⊙)…,本人感觉很简单的,归并排序好像比sort,快排的复杂度低,也就是说快一点,是NlogN的复杂度。既然说了归并排序,就不得不说下逆序对如codevs 1688 模板题

1688 求逆序对

题目描述 Description

给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目

!!!!!!数据范围:N<=105。Ai<=105。时间限制为1s。//注意这里范围

输入描述 Input Description

第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。

输出描述 Output Description

所有逆序对总数.

样例输入 Sample Input

4

3

2

3

2

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

  

    对于逆序对如果范围小,可以用冒泡排序,交换一次ans++;最后排好了答案就出来了。但是冒泡排序是O(n^2)的复杂度,一看数据范围是1e5

就知道要超时。所以就用归并排序,来实现问题。其实只需要加一句代码就行了

  

    加上这句就完啦,最后输出ans就可以了。

    为什么是加mid-q+1呢?

       我们在进行合并的时候是从小到大进行的,就是说,当把右段的数x放到临时数组t中的时候,左段的数一定比x都大,有mid-p+1个,这些数一定都和x成逆序对,因为他们的位置在x前,而值比x大。

      这就是逆序对的解法。

时间: 2024-10-03 13:46:26

归并排序&&逆序对(codves1688,4163)的相关文章

AcWing 107. 超快速排序(归并排序 + 逆序对)

在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 5 9. 您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序. 输入格式 输入包括一些测试用例. 每个测试用例的第一行输入整数n,代表该用例中输入序列的长度. 接下来n行每行输入一个整数aiai,代表用例中输入序列的具体数据,第i行的数据代表序列中第i个数. 当输入用例中包含

POJ 2299 Ultra-QuickSort(归并排序&#183;逆序对)

题意  给你一个数组求其中逆序对(i<j&&a[i]>a[j])的个数 我们来看一个归并排序的过程: 给定的数组为[2, 4, 5, 3, 1],二分后的数组分别为[2, 4, 5], [1, 3],假设我们已经完成了子过程,现在进行到该数组的"并"操作: a: [2, 4, 5] b: [1, 3] result:[1] 选取b数组的1 a: [2, 4, 5] b: [3] result:[1, 2] 选取a数组的2 a: [4, 5] b: [3] r

POJ - 2299 - Ultra-QuickSort = 归并排序 + 逆序对 / 树状数组

http://poj.org/problem?id=2299 求逆序对最简单的绝对不会是树状数组,一定是归并排序(认真),不过树状数组会不会快一点呢?理论上应该是树状数组快一点(假如不进行离散化). #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<map> #include<set

【排序】归并排序+逆序对应用

1 void merge_sort(int *A, int x, int y, int *T) 2 {//x为左端点,y为右端点 3 // 4 if(y-x<=1) return ; 5 int m = x + (y-x)/2;//划分 6 int p = x, q = m, i = x; 7 //递归 8 merge_sort(A, x, m, T); 9 merge_sort(A, m, y, T); 10 //归并 11 while(p < m || q < y)//只要有一个序列

LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对

P2804-神秘数字 题目描述(简化版) 有 n 个数,求这 n 个数中,有多少个连续的数的平均数大于某个给定的数 M? 注意:这个数可能会很大,请输出这个数对92084931取模的结果. 输入输出格式 输入格式: 共两行. 第一行为两个数 n 和 M. 第二行为 n 个数. 输出格式: 一行一个数,即问题的解对92084931取模的结果 输入输出样例 输入样例#1: 4 3 1 5 4 2 输出样例#1: 5 输入样例#2: 4 4 5 2 7 3 输出样例#2: 6 说明 [样例解释] ①对

codeforces 414C C. Mashmokh and Reverse Operation(归并排序求逆序对)

题目链接: C. Mashmokh and Reverse Operation time limit per test 4 seconds memory limit per test 512 megabytes input standard input output standard output Mashmokh's boss, Bimokh, didn't like Mashmokh. So he fired him. Mashmokh decided to go to university

归并排序求逆序对

归并排序求逆序对 by mps [1]什么是逆序对? 对于一个数列需要按从小到大排序,如果有ai,aj且满足ai>aj和i<j则ai,aj为一组逆序对 [2]如何求逆序对? 我们发现,我们可以暴力枚举i,j,然后逐一判断并累加答案即可,时间复杂度O(N2)        但是对于数据量大一点的题目,只有不断地TLE了→_→ [3]归并排序求逆序对 逆序对的定义(见[1])是一组本应该有序的序列中的逆序对,那么我们就想到了排序,但由于是要22匹配,我们又想到了归并排序 归并排序大致内容如下: 将

洛谷 P1908 逆序对 Label:归并排序||树状数组

题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对.知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目. 输入输出格式 输入格式: 第一行,一个数n,表示序列中有n个数. 第二行n个数,表示给定的序列. 输出格式: 给定序列中逆序对的数目. 输入输出样例 输

HDU 3743 Frosh Week(归并排序求逆序对)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程,分前后两段,当a[i] > a[j]时,说明a[j]比前面那段啊[i],a[i+1],a[i+2]....,a[mid],比这些都要小,所以总逆序对数要加上mid-i+1. 1 // File Name: HDU3743.cpp 2 // Author: xiaxiaosheng 3 // Cre