花了一晚上和上午的時間終於除錯出來了,一開始沒有考慮到存在相等數字的情況~~
這裡有必要對歸併排序進行總結。分為分治三步法
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 的逆序數就...