九度oj题目1348:数组中的逆序对

题目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\n",num);
71     }
72     return 0;
73 }

 

posted @ 2015-07-15 12:04  Deribs4  阅读(266)  评论(0编辑  收藏  举报