24h購物| | PChome| 登入
2009-11-19 20:06:52| 人氣2,997| 回應1 | 上一篇 | 下一篇

ACM 10810 Q10810: Ultra-QuickSort

推薦 0 收藏 0 轉貼0 訂閱站台

作法 : Merge Sort (合併排序)

紀錄的方法是:在Merge的時候

紀錄另一個數列  比這個數列小的個數

也就是說 在做Merge的時候  實際上
它會被翻轉的次數=另一個數列小於他的數字的次數

/***********************************************************/

#include<stdlib.h>
#include<stdio.h>
int NUM[500001];
long long int ANS=0;
int MergeSort(int,int);
int Merge(int,int,int);
main()
{
  int N;
  while(scanf("%d",&N)==1&&N)
      {
         int a,b,c;
         for(a=0;a<N;a++)
            scanf("%d",&NUM[a]);
         ANS=0;
         MergeSort(0,N-1);
         printf("%lld\n",ANS);
      }
  return 0;
}
int MergeSort(int l,int h)
{
   if(l<h)
      {
         int m=(l+h)/2;
         MergeSort(l,m);
         MergeSort(m+1,h);
         Merge(l,m,h);
      }
}
int Merge(int l,int m,int h)
{
   int in1=l,in2=m+1,out=l;
   int x[500001],top=0,a,b,D=0;
   while(in1<=m&&in2<=h)
      if(NUM[in1]>NUM[in2])
           x[top++]=NUM[in2++],D++;
      else
           x[top++]=NUM[in1++],ANS+=D;
   while(in1<=m)
       x[top++]=NUM[in1++],ANS+=D;
   while(in2<=h)
       x[top++]=NUM[in2++];
   for(a=l,b=0;a<=h;a++,b++)
      NUM[a]=x[b];
}

台長: 來源不明
人氣(2,997) | 回應(1)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 10791 Q10791: Minimum Sum LCM
此分類上一篇:ACM 10324 Q10324: Zeros and Ones

qeffp
台灣硬起來! 抵制菲律賓!!
2013-05-18 23:29:39
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文