• 3305: 逆序数


    题目描述

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
    如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
     

    输入

    第1行:N,N为序列的长度(n <= 50000)
    第2行:序列中的元素(0 <= A[i] <= 10^9)
     

    输出

    输出逆序数

    样例输入

    4
    2 4 3 1
    

    样例输出

    4

    实际上是归并排序, 顺便求一下逆序数

    #include <iostream>
    using namespace std;
    
    long long int a[50010], b[50010], temp[50010];
    int cnt;
    
    void Merge(int left, int mid, int right)
    {
    	int i = left, j = mid + 1, k = left;
    	while(i <= mid && j <= right)
    	{
    		if(a[i] > a[j])
    		{
    			temp[k ++] = a[j ++];
    			cnt = cnt + mid - i + 1;
    		}
    		else
    		{
    			temp[k ++] = a[i ++];
    		}
    	}
    	while(i <= mid)
    	{
    		temp[k ++] = a[i ++];
    	}
    	while(j <= right)
    	{
    		temp[k ++] = a[j ++];
    	}
    	for(i = left; i <= right; ++ i)
    	{
    		a[i] = temp[i];
    	}
    }
    
    void mergeSort(int left, int right)
    {
    	if(left < right)
    	{
    		int mid = left + (right - left) / 2;
    		mergeSort(left, mid);
    		mergeSort(mid + 1, right);
    		Merge(left, mid, right);
    	}
    }
    
    int main()
    {
    	int n, m;
    	cin >> n;
    	for(int i = 1; i <= n; ++ i)
    		cin >> a[i];
    		
    	mergeSort(1, n);
    	
    //	for(int i = 1; i <= n; ++ i)
    //		cout << a[i] << " ";
    //	cout << endl;
    	
    	cout << cnt << endl;
    	
    	return 0;
    } 
    

      

  • 相关阅读:
    2014 10 07 ················男人感悟100(转自MOP)
    BFS和DFS优先搜索算法
    求素数算法-网摘
    DP问题各种模型的状态转移方程 (转)
    srand函数
    #include<algorithm>
    常用算法一(分治算法)
    杭电ACM题目分类
    四方定理
    五大常用算法之二:动态规划算法
  • 原文地址:https://www.cnblogs.com/mjn1/p/10593150.html
Copyright © 2020-2023  润新知