nyoj 117 歸併求逆序數

2021-06-10 22:36:50 字數 703 閱讀 1123

花了一晚上和上午的時間終於除錯出來了,一開始沒有考慮到存在相等數字的情況~~

這裡有必要對歸併排序進行總結。分為分治三步法

1.劃分問題:把序列分成元素個數盡量相等的兩半

2.遞迴求解:把兩半元素分別排序

3.合併問題:把兩個有序表合併成乙個

此題求逆序中的第二步就是統計i,j均在左邊或者均在右邊的逆序對個數,合併問題則是統計i在左邊,但j在右邊的逆序對個數。

這裡採取的策略可以這樣理解,合併過程中,對於右邊的元素按照從小到大的序列排序出列時,每齣乙個,左邊存在幾個元素,這表示該元素相對於左邊有幾個逆序(這裡不包括自身右邊的元素)

ac**:

#include#include#includeusing namespace std;

long long sum;

int a[1000008];

void merge(int a,int first,int mid,int last,int b)

}while(i<=j)

b[t++]=a[i++];

while(k<=m)

b[t++]=a[k++];

for(k=0;ka[first+k]=b[k];

}void sort(int a,int first,int last,int b)

}int main()

}

nyoj117 求逆序數(歸併)

題意 時間限制 2000 ms 記憶體限制 65535 kb難度 5 描述在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數...

nyoj117求逆序數

時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就...

NYOJ117 求逆序數

時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就...