链接: https://www.nowcoder.com/acm/contest/77/A
来源:牛客网
来源:牛客网
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个 逆序 。一个排列中逆序的总数就称为这个排列的 逆序数 。比如一个序列为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)。
输出描述:
输出这个序列中的逆序数
输入
5 4 5 1 3 2
输出
7
题解:暴力不能解决。还是空间交换时间。
#include<stdio.h>
#include<string.h>
int a[100000+5];
int main ()
{
int n;
while(~scanf("%d",&n))
{
long long int sum=0,i,j,t;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%lld",&t);
sum=sum+a[t]; //计算小于t的数的个数
for(j=1;j<=t;j++) //小于t的前面的数加1
{
a[j]=a[j]+1;
}
}
printf("%lld\n",sum);
}
return 0;
}