codevs.1688 求逆序对

题目描述 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
直接归并排序求逆序数
代码如下:
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn = 100050;
long long int ans=0;
void merge_sort(long long *a,int x,int y,long long *t);
int main(){
   //freopen("Text.txt","r",stdin);
   int n,x;
   long long a[maxn],t[maxn];
   cin>>n;
   for(int i=1;i<=n;i++){
       cin>>x;
       a[i]=x;
   }
   merge_sort(a,1,n,t);
   /*for(int i=1;i<=n;i++)
   cout<<t[i]<<ends;
   cout<<endl;*/
   cout<<ans<<endl;
   return 0;
}
void merge_sort(long long *a,int x,int y,long long *t){
   if(x==y)return ;
   int m=(x+y)/2;
   int p=x,q=m+1,i=x;
   merge_sort(a,p,m,t);
   merge_sort(a,q,y,t);
   while(p<=m&&q<=y){
       if(a[p]>a[q]){
           ans+=m-p+1;
           t[i++]=a[q++];
       }
       else
          t[i++]=a[p++];
   }
   while(p<=m)t[i++]=a[p++];
   while(q<=y)t[i++]=a[q++];
   for(i=x;i<=y;i++)
      a[i]=t[i];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值