POJ2299----Ultra-QuickSort

 1 /*
 2 题意让你求交换次序,实际求逆序对数即可
 3 而归并排序时,刚好需要比较mid两边的数,所以只需在归并时累加即可
 4
 5 例:(归并时一定会排好小组内的顺序)
 6
 7 对应位置:   i   m j
 8 对应数字:   4 5 6 1 2 3
 9
10 4 > 1   -> ans += 3;//因为4为前半最小值,则前半部分所有元素符合要求(ans += m-i+1)
11 4 > 2   -> ans += 3;
12 4 > 3   -> ans += 3;
13  */
14 #include <iostream>
15 using namespace std;
16 const int maxn = 500010;
17 int a[maxn],t[maxn];
18 long long ans;
19 void merge(int a[], int l, int m, int r)
20     int i = l, j = m + 1, x = m, y = r, k = 0;
21     while(i <= x && j <= y)
22         if(a[i] > a[j])//记录答案
23         {
24              t[k++] = a[j++];
25              ans += x-i+1;
26         }
27         else t[k++] = a[i++];
28     while(i <= x) t[k++] = a[i++];
29     while(j <= y) t[k++] = a[j++];
30     for(int i = 0; i < k; ++i)
31         a[l+i] = t[i];
32 }
33 void merge_sort(int a[],int l,int r)
34 {
35     if(l >= r) return;
36     int m = (l+r)/2;
37     merge_sort(a,l,m);
38     merge_sort(a,m+1,r);
39     merge(a,l,m,r);
40 }
41 int main()
42 {
43     int n;
44     while(cin >> n && n)
45     {
46         ans = 0;
47         for(int i = 0; i < n; ++i)
48             cin >> a[i];
49         merge_sort(a,0,n-1);
50         cout << ans << endl;
51     }
52     return 0;
53 }
时间: 2024-10-12 01:45:56

POJ2299----Ultra-QuickSort的相关文章

poj-2299 Ultra—QuickSort(归并排序求逆序数)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 38688   Accepted: 13950 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

归并排序求逆序对模板(未完待续)

归并排序求逆序对题目(持续更新) \(1.\) \(Ultra\) \(Quicksort\) (需要该篇博文的阅读密码) 归并排序求逆序对 细节:传参三个,左.中.右三端点,每次运算注意中端点总取左右端点和的一半:返回条件为左右端点相等,此时无需排序. \(View\) \(Code\) void msort(int l,int mid,int r) { if(l==r) return; msort(l,(l+mid)>>1,mid); msort(mid+1,(r+mid+1)>&g

POJ-2299 Ultra-QuickSort(逆序对个数)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 57461   Accepted: 21231 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

数组去重算法,quickSort

function removeRepeat(arr) { var arr2 = [] ,obj = {}; for (var i = 0; i<arr.length; i++) { var num = arr[i]; //先把arr的第[i]num if( !obj[num] ){ //如果上面有个true,那么就不要push进数组,否则就push进数组 arr2.push(num); obj[num] = true; //不要忘记push到数组以后把obj上的属性设置为true,那么下次有一样

排序算法四:快速排序(Quicksort)

快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是o(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 1 protected void quicksort(int[] array, int first, int last) { 2 3 int pivot = array[first]; 4 int i = first; 5 int j = last - 1; 6 boolean serachBig =

快速排序QuickSort

前几天实现了直接插入排序.冒泡排序和直接选择排序这三个基础排序.今天看了一下冒泡排序的改进算法,快速排序.单独记录一下,后面还有归并和基数排序等 快速排序 1.选择一个支点默认为数组第一个元素及array[start]作为支点,将所有大于支点元素的值放到支点后面,将所有小于支点元素的值放到支点前面,完成一次划分,返回支点的位置index 2.通过一个划分形成两个带排序的序列,[start, index - 1]和[index + 1, end]两个,在执行1直到序列元素只有1个则已经完成排序 具

线段树求逆序数方法 HDU1394&amp;&amp;POJ2299

为什么线段树可以求逆序数? 给一个简单的序列 9 5 3 他的逆序数是3 首先要求一个逆序数有两种方式:可以从头开始往后找比当前元素小的值,也可以从后往前找比当前元素大的值,有几个逆序数就是几. 线段树就是应用从后往前找较大值得个数.(一边更新一边查) 当前个数是 n = 10 元素   9  5   3 9先加入线段树,T[9]+=1:查从T[9]到T[10]比9大的值,没有sum = 0: 5 加入线段树,T[5] += 1,查从T[5]到T[10]比5大的值,有一个9,sum +=1: 3

POJ2299 Ultra-QuickSort 【树状数组】+【hash】

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 39529   Accepted: 14250 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

快速排序(quicksort)

快速排序是对冒泡排序算法的一种改进型算法,而且快速排序也采用了分治法的思想.快速排序是不稳定排序, 平均时间复杂度为:O(n*logn),最坏时间复杂度为:O(n*n),空间时间复杂度:O(logn),但快速排序通常是用于排 序的最佳实用的选择. 快速排序的思想:从数组选取一个数(通常是第一个数)作为标准,从数组的高位开始查找,找到比作为标准数小的数 ,然后进行交换,又从数组的低位开始查找,找到比作为标准大的数,然后进行交换,重复以上步骤,直至从高位到低位, 低位到高位重合为止. 示例: 6  

排序--QuickSort 快排

Quick の implementation 快排,就像它的名字一定,风一样的快.基本上算是最快的排序算法了.快排的基本思想是选择一个切分的元素.把这个元素排序了.所有这个元素左边的元素都小于这个元素,所有这个元素右边的元素都大于这个元素.接着再把左右2个数组分别排序. 假设你有如下数组 (所有 i  左边的对象都小于 切分对象. 所有 j  右边的对象都大于切分对象 这句话稍后有用 先知道一下) 首先,我们把index = 0 的元素当作切分元素. 从index = 1 的位置开始,找到第一个