题目1348:数组中的逆序对
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2572
解决:606
- 题目描述:
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
- 输入:
-
每个测试案例包括两行:第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。第二行包含n个整数,每个数组均为int类型。
- 输出:
- 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。
- 样例输入:
-
4 7 5 6 4
- 样例输出:
-
5
注意:数据的表示范围!!long long!!
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <queue> 5 #include <stack> 6 #include <iostream> 7 using namespace std; 8 int a[100005],b[100005]; 9 long long num; 10 void merge(int s,int mid,int e){ 11 int p=s,q=mid+1,k=s; 12 while(p<=mid&&q<=e){ 13 if(a[p]>a[q]){ 14 num+=mid-p+1;//attention 15 16 //cout<<"p: "<<p<<" q: "<<q<<" "<<num<<endl; 17 18 b[k++]=a[q++]; 19 } 20 else{ 21 b[k++]=a[p++]; 22 } 23 } 24 25 //cout<<mid<<endl; 26 27 if(p>mid){ 28 while(k<=e){ 29 b[k++]=a[q++]; 30 } 31 } 32 else{ 33 while(k<=e){ 34 b[k++]=a[p++]; 35 } 36 } 37 int i; 38 for(i=s;i<=e;i++){ 39 a[i]=b[i]; 40 } 41 } 42 void mergesort(int s,int e){ 43 if(s>=e) 44 return;//attention!! 45 int mid=(s+e)/2; 46 47 //cout<<mid<<endl; 48 49 mergesort(s,mid); 50 51 //cout<<mid<<endl; 52 53 mergesort(mid+1,e); 54 merge(s,mid,e); 55 } 56 int main(){ 57 //freopen("D:\INPUT.txt","r",stdin); 58 int n; 59 while(scanf("%d",&n)!=EOF){ 60 int i=0; 61 for(;i<n;i++){ 62 scanf("%d",&a[i]); 63 //cout<<a[i]<<endl; 64 } 65 num=0; 66 67 //cout<<n<<endl; 68 69 mergesort(0,n-1); 70 printf("%lld ",num); 71 } 72 return 0; 73 }