[2016-05-10][51nod][1019 逆序数]

  • 时间:2016-05-10 15:33:59 星期二

  • 题目编号:[2016-05-10][51nod][1019 逆序数]

  • 题目大意:求一列数的逆序数

  • 分析:

    • 分治
    • 把A平均分成B,C两列
    • 逆序对(I,j),要么I,j都属于B,要么i,j都属于C,要么I属于B,j属于C,
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<vector>
  4. using namespace std;
  5. typedef long long ll;
  6. vector<int> A;
  7. ll merge_count(vector<int> & a){
  8. int n = a.size();
  9. if(n <= 1) return 0;
  10. ll cnt = 0;
  11. vector<int> b(a.begin(),a.begin() + n / 2);
  12. vector<int> c(a.begin() + n / 2,a.end());
  13. cnt += merge_count(b);
  14. cnt += merge_count(c);
  15. int ai = 0,bi = 0,ci = 0;
  16. while(ai < n ){
  17. if(bi < b.size() && (ci == c.size() || b[bi] <= c[ci])){
  18. a[ai++] = b[bi++];
  19. }else {
  20. cnt += n / 2 - bi;
  21. a[ai++] = c[ci++];
  22. }
  23. }
  24. return cnt;
  25. }
  26. int main(){
  27. int n,tmp;
  28. scanf("%d",&n);
  29. A.resize(n + 1);
  30. A.clear();
  31. for(int i = 0 ; i < n ; ++i){
  32. scanf("%d",&tmp);
  33. A.push_back(tmp);
  34. }
  35. printf("%lld\n",merge_count(A));
  36. return 0;
  37. }


来自为知笔记(Wiz)


posted on 2016-05-10 15:56  红洋  阅读(174)  评论(0编辑  收藏  举报

导航