首页 > 代码库 > 1688 求逆序对
1688 求逆序对
1688 求逆序对
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目
数据范围:N<=105。Ai<=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 求逆序对
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。