您的位置:首页 > 其它

一本通 第二部分 基础算法 第二章 数据排序 1311:【例2.5】求逆序对

2018-12-19 16:18 295 查看

1311:【例2.5】求逆序对

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 6093 通过数: 1270
【题目描述】
给定一个序列a1,a2,…,ana1,a2,…,an,如果存在i<ji<j并且ai>ajai>aj,那么我们称之为逆序对,求逆序对的数目。

【输入】
第一行为nn,表示序列长度,接下来的nn行,第i+1i+1行表示序列中的第ii个数。

【输出】
所有逆序对总数。

【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
N≤105,Ai≤105N≤105,Ai≤105。

#include<bits/stdc++.h>
using namespace std;
long long a[100001],r[100001];
long long n,ans;
void asort(long long begin,long long end)
{
if(begin==end)
return;
long long mid=(begin+end)/2;
asort(begin,mid);
asort(mid+1,end);
long long x=mid+1,y=begin,z=begin;
while(x<=end&&y<=mid)
if(a[x]<a[y])
{
ans+=mid-y+1;
r[z++]=a[x++];
}
else
r[z++]=a[y++];
while(x<=end)
r[z++]=a[x++];
while(y<=mid)
r[z++]=a[y++];
for(long long i=begin;i<=end;i++)
a[i]=r[i];
}
int main()
{
cin>>n;
for(long long i=1;i<=n;i++)
cin>>a[i];
asort(1,n);
cout<<ans;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐