1311:【例2.5】求逆序对

简介: 1311:【例2.5】求逆序对

1311:【例2.5】求逆序对

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

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

【输入】

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

【输出】

所有逆序对总数。

【输入样例】

4

3

2

3

2

【输出样例】

3

【提示】

N≤10^5,Ai≤10^5。

【来源】

No

1. #include <iostream>
2. using namespace std;
3. long long a[100001];
4. long long r[100001];
5. long long ans=0;
6. void msort(long long s,long long t){
7.  if(s==t) return;
8.  long long mid=(s+t)/2;
9.  msort(s,mid);
10.   msort(mid+1,t);
11.   long long i=s,j=mid+1,k=s;
12.   while(i<=mid && j<=t){
13.     if(a[i]<=a[j]){
14.       r[k]=a[i];k++;i++; 
15.     }
16.     else{
17.       r[k]=a[j];k++;j++;
18.       ans+=mid-i+1;
19.     }
20.   }
21.   while(i<=mid) {
22.     r[k]=a[i];k++;i++;
23.   }
24.   while(j<=t){
25.     r[k]=a[j];k++;j++;
26.   }
27.   for(i=s;i<=t;i++) a[i]=r[i];
28. }
29. int main(int argc,char* argv[])
30. {
31.   long long n,i;
32.   cin>>n;
33.   for(i=0;i<n;i++) cin>>a[i];
34.   msort(0,n-1);
35.   cout<<ans<<endl;
36.   return 0;
37. }

 

相关文章
|
6天前
杨氏矩阵( 时间复杂度要求小于O(N) )
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在,且程序的时间复杂度要小于O(N);
|
6天前
|
测试技术
leetcode-152:乘积最大子数组
leetcode-152:乘积最大子数组
30 0
|
10月前
1275:【例9.19】乘积最大
1275:【例9.19】乘积最大
|
10月前
|
算法
解 旋转数组
解 旋转数组
|
11月前
逆序对问题
逆序对问题
55 0
|
11月前
|
C++
剑指offer 53. 数组中的逆序对
剑指offer 53. 数组中的逆序对
59 0
剑指offer 53. 数组中的逆序对
|
11月前
旋转数组
旋转数组
40 0
子数组问题总结(很多子数组求法类似,暴力求法)
子数组问题总结(很多子数组求法类似,暴力求法)
子数组问题总结(很多子数组求法类似,暴力求法)
Day29——491.递增子序列、 46.全排列、47.全排列 II
Day29——491.递增子序列、 46.全排列、47.全排列 II
72 0
|
人工智能
K个逆序对数组
K个逆序对数组