当前位置:   article > 正文

2023首届大学生算法大赛 - 逆序对_首届大学生算法设计大赛

首届大学生算法设计大赛


一眼应该能看出来这道题朴素算法是冒泡排序,但是逆序对这类题要求复杂度小于等于O(nlogn), 因此可以用线段树,树状数组,归并排序之类的试试。

洛谷上有一样的题:逆序对 - 洛谷

AC代码(归并排序)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,a[100001],b[100001];
  4. long long ans;
  5. void merge(int l,int r){
  6. if(l==r)return;
  7. int mid=l+r>>1;
  8. merge(l,mid);
  9. merge(mid+1,r);
  10. //[l,i,mid][mid+1,j,r]
  11. int i=l,j=mid+1,k=l;
  12. while(i<=mid and j<=r){
  13. if(a[i]<a[j])b[k++]=a[i++];
  14. else b[k++]=a[j++],ans+=mid-i+1;//放入a[j],说明a[i,mid]都比a[j]大,产生mid-i+1个逆序对
  15. }
  16. while(i<=mid)b[k++]=a[i++];
  17. while(j<=r)b[k++]=a[j++];
  18. for(i=l;i<=r;++i)a[i]=b[i];
  19. }
  20. int main(){
  21. ios::sync_with_stdio(false);
  22. cin.tie(nullptr),cout.tie(nullptr);
  23. cin>>n;
  24. for(int i=1;i<=n;++i)
  25. cin>>a[i];
  26. merge(1,n);
  27. cout<<ans;
  28. return 0;
  29. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/728706
推荐阅读