解题思路:
实质是排序后求逆序对
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int MAXN = 100000 + 10;...
分类:
其他好文 时间:
2015-04-22 18:26:11
阅读次数:
133
题意:给你n个可以重复的无序数列,问经过k次相邻交换后最少还有多少对逆序数
求逆序对可以用树状数组来做,对于重复的元素,可能在sort的时候交换编号
求和的时候要注意去重,还有一种方法就是稳定排序stable_sort
#include
#include
#include
using namespace std;
#define ll __int64
#define N 100000+10
...
分类:
编程语言 时间:
2015-04-14 10:01:37
阅读次数:
132
我们知道,求逆序对最典型的方法就是树状数组,但是还有一种方法就是Merge_sort(),即归并排序。实际上归并排序的交换次数就是这个数组的逆序对个数,为什么呢?我们可以这样考虑:归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来。在合...
分类:
编程语言 时间:
2015-04-04 11:52:14
阅读次数:
194
思路:
分治法 归并排序的过程中,有一步是从左右两个数组中,每次都取出小的那个元素放到tmp[]数组中
右边的数组其实就是原数组中位于右侧的元素。当不取左侧的元素而取右侧的元素时,说明左侧剩下的元素均比右侧的第一个元素大,即均能构成一个逆序对。假设现在左侧剩余n个元素,则逆序对数+n。
另外,如果当所有右侧的元素都取完,但是左侧仍然有元素剩余时,左侧剩余的元素已经在之前的运算中加到了逆序对中...
分类:
其他好文 时间:
2015-04-02 22:37:16
阅读次数:
223
题意:求n个数的逆序对数,可以交换k次相邻的,所以求出原序列的逆序对后减去k即可。
思路:求逆序对有两种方法,归并排序和树状数组。逆序对的几种求法...
分类:
编程语言 时间:
2015-04-01 09:42:24
阅读次数:
296
设A[1..n]是一个包含n个不同整数的数组。如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。
给出一个算法,确定n个元素的任何排列中逆序对的书目。时间复杂度为o(nlgn)。
分治法求解思路:
分解:将数组A[1..n]分为两个子序列A[1..p]和A[p+1,n],二分法将其分解。。
解决:根据归并排序的思想,在合并过程中,计算逆序对。假如两...
分类:
其他好文 时间:
2015-03-27 22:19:52
阅读次数:
200
Ultra-QuickSortTime Limit: 7000MSMemory Limit: 65536KTotal Submissions: 45290Accepted: 16440DescriptionIn this problem, you have to analyze a particul...
分类:
编程语言 时间:
2015-03-10 22:46:25
阅读次数:
275
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程,分前后两段,当a[i] > a[j]时,说明a[j]比前面那段啊[i],a[i+1],a[i+2]...
分类:
编程语言 时间:
2015-03-10 00:09:28
阅读次数:
190
//用树状数组求出在b前面比b小的数的个数
//然后求b后面的顺序对的个数,
//枚举b可得quad
//由于数列是从1到n的所有数
//那么(n-num[j])-(j-1-totol[j])即为第j个数之后比j大的数的个数
//其中num[j]表示第j个数,total[j]表示在j之前比j小的数的个数
#include
#include
#include
using names...
分类:
编程语言 时间:
2015-03-07 15:43:58
阅读次数:
173