数据结构实验之排序五:归并求逆序数

来源:互联网 发布:端游的没落 知乎 编辑:程序博客网 时间:2024/06/04 01:25


数据结构实验之排序五:归并求逆序数

Time Limit: 50MS Memory Limit: 65536KB
SubmitStatistic

Problem Description

对于数列a1,a2,a3…中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对;在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求出数列的逆序数。

Input

输入数据N(N <= 100000)表示数列中元素的个数,随后输入N个正整数,数字间以空格间隔。

 

Output

输出逆序数。

Example Input

1010 9 8 7 6 5 4 3 2 1

Example Output

45
#include <bits/stdc++.h>using namespace std;long long sum;int temp[100010], a[100010];void Merge(int s1, int e1, int s2, int e2){    int p = 0;    int p1 = s1;    int p2 = s2;    while(p1 <= e1 && p2 <= e2)    {        if(a[p1]<=a[p2])        {            temp[p++] = a[p1++];        }        else        {            temp[p++] = a[p2++];            sum+= (e1-p1+1);        }    }    while(p1 <= e1)    {        temp[p++] = a[p1++];    }    while(p2 <= e2)    {        temp[p++] = a[p2++];    }    int i;    for(i = s1; i <= e2; i++)    {        a[i] = temp[i-s1];    }}void Mergesort(int s, int e){    int mid;    if(s < e)    {        mid = (s+e)/2;        Mergesort(s, mid);        Mergesort(mid+1, e);        Merge(s, mid, mid+1, e);    }}int main(){    ios::sync_with_stdio(false);    int n;    cin >> n;    int i;    for(i = 0; i < n; i++)    {        cin >> a[i];    }    sum = 0;    Mergesort(0, n-1);    cout << sum;    return 0;}
阅读全文
0 0
原创粉丝点击