`
Coco_young
  • 浏览: 126397 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

POJ_2299_归并排序_统计逆序数

阅读更多

链接: http://poj.org/problem?id=2299




分析:统计给定序列中的逆序数,蛮力法复杂度达O(n^2)会超时,由于归并排序复杂度为O(nlogn)
并且,在排序过程中可以顺便统计逆序数,所以用归并排序可以求出。


注意:在求逆序数时要注意,每当前半部分的数被加入到辅助数组中时,逆序数总数应当增加后半部分已经被添加到辅助数组中的元素的总个数.

#include<stdio.h>
#include<stdlib.h>
//归并排序统计
#define SIZE 500010 
int arr[SIZE],T[SIZE];
long long  cnt = 0;
void MergeSort(int *A,int *T,int l,int r)
{
    if(l==r)
    {
       return;
    }
    else
    {
        int mid = (l+r)/2;
        //左右递归 
        MergeSort(A,T,l,mid);
        MergeSort(A,T,mid+1,r);
        //merge
        int i,j,k;
        for(i=l,j=mid+1,k=l;k<=r;)
        {
           if(i>mid&&j<=r)
           {
              T[k++] = A[j++];
           }
           else if(i<=mid&&j<=r&&A[i]>A[j])
           {
              T[k++] = A[j++];
           }
           else if(i<=mid&&j<=r&&A[i]<=A[j])
           {
              T[k++] = A[i++];
              cnt+=(j-mid-1);
           }
           else if(i<=mid&&j>r)
           {
              cnt+=(j-mid-1);
              T[k++] = A[i++];
           }
        }
        for(int i=l;i<=r;i++)
        A[i] = T[i];
    }
}
int main()
{
    int n;
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(scanf("%d",&n),n)
    {
       for(int i=0;i<n;i++)
       {
          scanf("%d",&arr[i]);
       }
       cnt = 0;
       MergeSort(arr,T,0,n-1);
       printf("%I64d\n",cnt);
    }
    return 0;
}

  • 大小: 16.6 KB
分享到:
评论

相关推荐

    POJ 2299_AC

    在这里要用到__int64,也就是long long int

    POJ1804-Brainman【借助Mergesort求逆序数O(nlogn)】

    在`POJ1804-Brainman【借助Mergesort求逆序数O(nlogn)】.cpp`文件中,你应该能够找到使用归并排序算法计算逆序对的实现。这种方法相比于直接求解,虽然增加了额外的排序操作,但大大提高了时间效率,尤其在处理大...

    求逆序数对1

    归并排序算法是一种常见的排序算法,也可以用来解决逆序数对问题。该算法的基本思路是将序列分成两个部分,然后对每个部分进行排序,最后将两个部分合并。在合并过程中,可以统计逆序数对的数量。该算法的时间复杂度...

    poj各种分类

    快速排序、归并排序和堆排序等,不仅用于排序,也常用于解决与逆序数相关的问题,如poj2388。 #### 并查集 用于处理集合的合并与查询操作,如poj3349所示。 #### 哈希表 高效查找数据的工具,利用哈希函数将数据...

    POJ 100题代码

    10. 题目3210《Counting Inversions》:该题考察逆序对计数,是排序算法中常见问题,可以使用分治思想结合归并排序进行优化解决。 以上只是对部分题目的简要概述,实际解题过程中,每个题目都可能需要深入理解和...

    强大的POJ分类——各类编程简单题及其算法分类

    2. **排序**:包括快速排序、归并排序(涉及逆序数)、堆排序,如POJ2388、2299。 3. **并查集**:处理集合合并和查询问题。 4. **哈希表** 和 **二分查找**:提供高效查找能力,如POJ3349、3274、2151、1840、2002...

    ACM算法总结大全——超有用!

    2. 排序:快速排序、归并排序(涉及逆序数)和堆排序,如poj2388、poj2299。 3. 并查集:处理集合合并与查询,如poj3349。 4. 哈希表和二分查找:快速查找,如poj3274、poj2151等。 5. 哈夫曼树:用于压缩编码,如...

    ACMer需要掌握的算法讲解.pdf

    2. 排序:快速排序、归并排序(涉及逆序数)和堆排序,如POJ2299。 3. 并查集:简单应用,用于处理集合连接和查询。 4. 哈希表和二分查找:提高查找效率,如POJ3349。 5. 哈夫曼树:压缩编码,如POJ3253。 6. 堆:如...

    很快速的提高算法能力.docx

    - **排序**:理解快速排序、归并排序和堆排序,注意与逆序数相关的排序,如Poj2388、Poj2299。 - **并查集**:掌握其基本操作和应用。 - **哈希表和二分查找**:利用这些高效查找方法,如Poj3349、Poj3274等。 -...

    【最新+免费】ACM主要算法.doc

    2. 排序:快速排序、归并排序和堆排序,涉及逆序数问题,如POJ 2388。 3. 并查集:简单的应用场景。 4. 哈希表和二分查找:高效查找,如POJ 3349。 5. 哈夫曼树:压缩编码,如POJ 3253。 6. 堆:如POJ 2513。 7. ...

    ACM算法总结大全——超有用!.pdf

    2. **排序**:快速排序、归并排序、堆排序,其中归并排序与逆序数计算相关,如POJ2388、POJ2299。 3. **并查集**:简单应用在一些集合操作中,如合并和查询。 4. **哈希表和二分查找**:高效查找方法,如POJ3349、...

    POJ1000-1299中的80题AC代码

    2. **算法**:排序(冒泡、选择、插入、快速、归并等)、搜索(顺序、二分、深度优先、广度优先等)、动态规划(记忆化搜索、状态转移方程)、贪心算法、回溯法、分支限界法等。 3. **字符串处理**:KMP算法、Rabin...

    ACM训练方案

    2. 排序:快速排序、归并排序和堆排序,尤其关注与逆序数相关的归并排序。 3. 并查集:简单应用,例如路径压缩和路径查找。 4. 哈希表和二分查找:高效查找方法,如poj3349、poj3274等。 5. 哈夫曼树:poj3253展示了...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    4.2归并排序+逆序数的求取 128 5.字符串 130 5.1 KMP应用 130 5.2 后缀数组 131 5.3 中缀表达式转后缀表达式 134 5.4 Firefighters 表达式求值 135 6.博弈 139 6.1 博弈的AB剪枝 139 6.1.1 取石子 139 6.2 博弈 SG...

    很有用很有用很有用的数据结构

    可以用来实践枚举法,1456、1700和1716则适合贪心法的应用,而2299逆序数和1664递归问题可以加深对递归与分治法的理解。 总结来说,数据结构中的枚举法、贪心法和递归与分治法是解决不同种类问题的有效手段。枚举法...

Global site tag (gtag.js) - Google Analytics