51Nod-1019-逆序数

                1019 逆序数

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。

如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。

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

Output
输出逆序数

Input示例
4
2
4
3
1
Output示例
4

这道题看了大佬的解题方法,感觉特别玄妙。大佬用的是归并排序解题,一边排序的同时一边计算出逆序对的数目。这里适当修改了一下归并排序的模板,python3代码如下:

def Mergearray(A, left, right):
    mid = (left+right)>>1
    i, j = left, mid+1
    B = []
    global ans

    while i <= mid and j <= right:
        if A[i] <= A[j]:
            B.append(A[i])
            i += 1
        else:
            B.append(A[j])
            j += 1
            #当后一半的区间里有数据插入前一半区间时候,定有逆序数
            ans += mid - i + 1 #核心代码,统计逆序数

    while i <= mid:
        B.append(A[i])
        i += 1
    while j <= right:
        B.append(A[j])
        j += 1

    for i in range(len(B)):
        A[left+i] = B[i]

def Mergesort(A, left, right):
    if left < right:
        mid = (left+right)>>1
        Mergesort(A, left, mid)
        Mergesort(A, mid+1, right)
        Mergearray(A, left, right)

while True:
    try:
        n = int(input())
        A = []
        ans = 0
        for i in range(n):
            A.append(int(input()))

        Mergesort(A, 0, len(A)-1)
        print(ans)
    except EOFError:
        break

这段python代码太慢了,在51nod上运行用了1000多ms,而C只用了100多ms。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值