zoukankan      html  css  js  c++  java
  • 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;
    } 
    

      

  • 相关阅读:
    Python面向对象
    Python
    05、Win7上openSSH的安装与配置
    关于C++中的类型转换
    正确地使用智能指针
    为多态基类声明多态析构函数
    透视校正插值(Perspective-Correct Interpolation)
    保持const和non-const函数代码的一致
    第二章 信息的表示和处理
    《Linux内核分析》课程总结
  • 原文地址:https://www.cnblogs.com/mjn1/p/10593150.html
Copyright © 2011-2022 走看看