列表

详情


NC15163. 逆序数

描述

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个序列为4 5 1 3 2, 那么这个序列的逆序数为7,逆序对分别为(4, 1), (4, 3), (4, 2), (5, 1), (5, 3), (5, 2),(3, 2)。

输入描述

第一行有一个整数n(1 <= n <= 100000),  然后第二行跟着n个整数,对于第i个数a[i],(0 <= a[i] <= 100000)。

输出描述

输出这个序列中的逆序数

示例1

输入:

5
4 5 1 3 2

输出:

7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 652ms, 内存消耗: 4848K, 提交时间: 2021-07-11 10:47:24

#include<stdio.h>
int main()
{int s[1000000]={0},n,i,j,a;
long long sum=0;
scanf("%d",&n);
while(n--){scanf("%d",&a);
   sum+=s[a];
   for(i=0;i<a;i++)
   s[i]++;}
printf("%lld",sum);}

Python3 解法, 执行用时: 141ms, 内存消耗: 16764K, 提交时间: 2023-03-09 11:08:03

import bisect
n=int(input())
ls=list(map(int,input().split()))
q = []
res = 0
for v in ls:
    i = bisect.bisect_left(q, -v)
    res += i
    q[i:i] = [-v]
print(res)

pypy3 解法, 执行用时: 131ms, 内存消耗: 34464K, 提交时间: 2022-04-03 12:27:32

import bisect
n=input()
t,ans = [],0
for _ in list(map(int,input().split())):
    i = bisect.bisect_left(t, -_)
    ans += i
    t[i:i] = [-_]
print(ans)

上一题