首页 > 代码库 > 1688 求逆序对

1688 求逆序对

1688 求逆序对

 

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
 
 
 
 
题目描述 Description

给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目

 

数据范围:N<=105Ai<=105。时间限制为1s。

 

输入描述 Input Description

第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。

输出描述 Output Description

所有逆序对总数.

样例输入 Sample Input

4

3

2

3

2

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint
 
 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 long long int a[1000001]; 5 int tot; 6 int n; 7 long long int ans[1000001];//储存结果  8 int now;//表示已经有多少个结果  9 void f(int s,int t)10 {11     //int mid,i,j,k;12     if(s==t)return;13     int mid=(s+t)/2;14     f(s,mid);15     f(mid+1,t);16     int i=s;17     int j=mid+1;18     now=s;19     while(i<=mid&&j<=t)20     {21         if(a[i]<=a[j])22         {23             //tot++;24         25             ans[now]=a[i];26             i++;27             now++;28         }29         else30         {    31             tot=tot+j-i;32             ans[now]=a[j];33             j++;34             now++;35         }36     }37     while(i<=mid)38     {39         ans[now]=a[i];40         i++;41         now++;42     }43     while(j<=t)44     {45         ans[now]=a[j];46         j++;47         now++;48     }49     for (i=s;i<=t;i++)//把合并后的有序数据重新放回a数组50         a[i] = ans[i];51 52 }53 int main()54 {55     int n;56     cin>>n;57     for(int i=1;i<=n;i++)58         cin>>a[i];59     f(1,n);60     //cout<<tot;61     /*for(int i=1;i<=n;i++)62     {63         cout<<a[i]<<" ";64     }*/65     cout<<tot;66     return 0;67 }

 

1688 求逆序对