zoukankan      html  css  js  c++  java
  • POJ2299 UltraQuickSort

      原题传送:http://poj.org/problem?id=2299

      归并排序求逆序数,nlog(n),500多ms。答案最大可以达到n * (n + 1) / 2,要开long long。

    View Code
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #define N 500005
     4  #define LL __int64
     5  LL a[N], b[N];
     6  int n;
     7  
     8  LL cal(LL s, LL t)
     9  {
    10      LL i, j, k, mid;
    11      LL res;
    12      if(t - s == 1)
    13          return 0;
    14      mid = (s + t) >> 1;
    15      res = cal(s, mid) + cal(mid, t);
    16      i = s, j = mid, k = s;
    17      while(i < mid && j < t)
    18      {
    19          if(a[i] <= a[j])
    20              b[k ++] = a[i ++], res += j - mid;
    21          else
    22              b[k ++] = a[j ++];
    23      }
    24      while(i < mid) b[k ++] = a[i ++], res += j - mid;
    25      while(j < t) b[k ++] = a[j ++];
    26      for(i = 0; i < t - s; i ++)
    27          a[s + i]= b[s + i];
    28      return res;
    29  }
    30  
    31  int main()
    32  {
    33      while(scanf("%d", &n), n)
    34      {
    35          for(LL i = 0; i < n; i ++)
    36              scanf("%I64d", &a[i]);
    37          printf("%I64d\n", cal(0, n));
    38      }
    39      return 0;
    40  }

      POJ1007用的是一样的算法。

  • 相关阅读:
    CSU L: 就多了两分钟
    CSU 1112【机器人的指令】模拟
    P3388 【模板】割点(割顶)
    go 学习 2
    go 学习 1
    netconf协议
    lua 学习 5
    lua 学习 4
    lua 学习 3
    lua 学习 2
  • 原文地址:https://www.cnblogs.com/huangfeihome/p/2684697.html
Copyright © 2011-2022 走看看