出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,171>, <178,170>, <178,171>, <180,170>, <180,171>. 现在要求从一个整数序列中找出所有这样的错误对: 分析: 逆序对(Inversion Pair):在N个可判断大小的数中,逆序对的数量为[0,n(n-1)/2]…
前置: nlogn逆序对: 前一个小时我还真的不会这个Orz 这里运用归并排序的思想. 对于一个序列,我们把它先分开,再合并成一个有序序列. 引自https://blog.csdn.net/qq_30189255/article/details/50937307 假设f(i,j)为i到j号元素中的逆序对个数,取一个分割点k,假设s(i,j,k)表示以k为分割点,第一个元素在i到k中,第二个元素在k+1到j中形成的逆序对数.那么我们就得到一个递归式:f(i,j)=f(i,k)+f(k+1,j)+s…
定义:A是包含n个元素的有序序列{a1,a2 … an},若ai > aj 且 i < j ,则称 (ai , aj)是A的一个逆序对.求逆序对是指求出A中存在逆序对的数量. 这个算法是归并排序的演化,仅需加上一行,就可以求逆序对个数. 简单的概括是:在把两个子序列合并时(两个子序列已经有序),如果当前选的最小的数在后面那个序列中,就把ans加上前面那个数组剩下的元素个数. 具体一点来讲,设指针i,j分别指向左子序列和右子序列中的某个数,即low<=I<=mid,mid+1<…
题面 给定 n , k n,k n,k ,求长度为 n n n 逆序对个数为 k k k 的排列个数,对 1 e 9 + 7 \rm1e9+7 1e9+7 取模. 1 ≤ n , k ≤ 100   000 1\leq n,k\leq 100\,000 1≤n,k≤100000 . 题解 首先,不要看到逆序对就手忙脚乱,它其实是可控的. 令 d i d_i di​ 为第 i i i 个数前面比它大的数的个数,满足条件 d i ∈ [ 0 , i ) d_i\in[0,i) di​∈[0,i) .…
树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树状数组.这也是学习树状数组的第一题. 算法的大体流程就是: 1.先对输入的数组离散化,使得各个元素比较接近,而不是离散的, 2.接着,运用树状数组的标准操作来累计数组的逆序数. 算法详细解释: 1.解释为什么要有离散的这么一个过程? 刚开始以为999.999.999这么一个数字,对于int存储类型来…
常用算法(后面有inplace版本): package ArrayMergeSort; import java.util.Arrays; public class Solution { public int[] mergeSort(int[] arr) { if (arr.length == 1) return arr; else { int[] arr1 = Arrays.copyOfRange(arr, 0, arr.length/2); int[] arr2 = Arrays.copyOf…
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数字跟后面的数字比较,如果大于的话,则这两个数字构成了逆序对.(比较简单,这里就不贴出代码) 时间复杂度:O(n^2) 2.归并思想 将数组不断地等分为两个子数组,然后自下而上地统计两个子数组各自的逆序对以及合并后的逆序对. 假设两个子数组左右分别为A,B,长度分为lenA,lenB,子数组已排好序,…
http://ac.jobdu.com/problem.php?pid=1348 数组中的逆序对也是个常见的题目,算法导论中也有一些描述,参考:http://www.cnblogs.com/wuyuegb2312/p/3156286.html.解法自然有朴素解法O(n^2)不表,然后有基于归并排序的,可以O(n*logn). 1.在归并排序中,同样是对一个数组分为两段处理,在处理这两段时,并不会影响右段元素与左段元素的逆序关系,只有在归并时才会改变.2.归并时的改变方式和插入排序是类似的:右段中…
[题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状数组套平衡树,O(nlogn)的啊.. 别人家的CDQ分治更屌..我垃圾咯. 只是存个代码: #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<…
题目链接:hdu_5193_Go to movies Ⅱ 题意: 有n个人站成一排,每个人的身高为Hi.每次有人加入或者有人离开,就要判断有多少人站反了(i < j&&Hi>Hj) 第一行n,m,接下来n个整数(n,m<=2e4) 接下来m行, 0 x y 表示有一个身高为y的人插在x后面,x=0表示插在最前面.(1≤y≤n) 1 x 表示第x个人(从左到右)离开. 题解: 官方题解: 添加或者删除一个元素时,维护逆序对时,需要知道在它之前有多少个数比它大,在它之后有多少…