4:求逆序对数
-
总时间限制:
- 500ms 内存限制:
- 65536kB
-
描述
-
对于一个长度为N的整数序列A,满足i < j 且 Ai > Aj.的数对(i,j)称为整数序列A的一个逆序
<j<=n且ai><j<=n且ai><j<=n且ai><j<=n且ai>请求出整数序列A的所有逆序对个数
输入
-
输入包含多组测试数据,每组测试数据有两行
第一行为整数N(1 <= N <= 20000),当输入0时结束
第二行为N个整数,表示长为N的整数序列
输出
- 每组数据对应一行,输出逆序对的个数 样例输入
-
5 1 2 3 4 5 5 5 4 3 2 1 1 1 0
样例输出
-
0 10 0
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; long long int ans=0; int n; int a[20005]; int b[20005]; void mergesort(int l,int mid,int r) { int ll=l,rr=mid+1,ss=l; while(ss<=r) { if(rr>r||a[ll]<=a[rr]&&ll<=mid) { b[ss]=a[ll]; ll++; } else { b[ss]=a[rr]; ans+=mid-ll+1; rr++; } ss++; } for(int i=l;i<=r;++i) { a[i]=b[i]; } } void merge(int l,int r) { if(l==r)return ; int mid=(l+r)/2; merge(l,mid); merge(mid+1,r); mergesort(l,mid,r); } int main() { int n; while(cin>>n&&n) { for(int i=0;i<n;++i) { cin>>a[i]; } ans=0; merge(0,n-1); cout<<ans<<endl; } return 0; }