a703 求逆序對

2021-09-28 10:09:33 字數 938 閱讀 8942

time limit: 10 second

memory limit: 2 mb

問題描述

給定乙個序列a1,a2...an。如果存在i小於j 並且ai大於aj,那麼我們稱之為逆序對,求給定序列中逆序對的數目

第一行為n,表示序列長度,接下來的n行,第i+1行表示序列中的第i個數。

所有逆序對的總數

432

32

3
【題解】

在進行歸併排序的同時求逆序對。

我們在進行歸併排序時。

分成l..mid和mid+1..r

假設左邊迴圈變數為i,右邊的迴圈變數為j。

則當我們找到乙個i和j滿足a[i] > a[j]時。

因為左邊,右邊都是有序的,則a[i+1..mid]都大於a[j];

而之後我們會吧a[j]加入到temp陣列中,此後a[j]不再出現。

則逆序對的數目增加mid-i+1;

然後逆序對數目用資料範圍大的型別儲存就好了。

【**】

#include int n,a[100009],temp[100009];

double tot = 0;

void input_data()

void mergesort(int l,int r) //對區間[l,r]進行分割

while (i <= mid)

temp[k++] = a[i++];

while (j <= r) //剩下相同的數字也要放進temp陣列

temp[k++] = a[j++];

for (int w = l;w<=r;w++) //最後再把temp陣列賦值給原陣列

a[w] = temp[w];

}void output_ans()

int main()

a703 求逆序對 線段樹的解法

time limit 10 second memory limit 2 mb 問題描述 給定乙個序列a1,a2.an。如果存在i小於j 並且ai大於aj,那麼我們稱之為逆序對,求給定序列中逆序對的數目 第一行為n,表示序列長度,接下來的n行,第i 1行表示序列中的第i個數。所有逆序對的總數 432 ...

a703 求逆序對 線段樹的解法

time limit 10 second memory limit 2 mb 問題描述 給定乙個序列a1,a2.an。如果存在i小於j 並且ai大於aj,那麼我們稱之為逆序對,求給定序列中逆序對的數目 第一行為n,表示序列長度,接下來的n行,第i 1行表示序列中的第i個數。所有逆序對的總數 432 ...

歸併求逆序對

求這個逆序對只需要在歸併排序的 中加一句即可。感覺自己有點說不清楚,隨手附上別人的詳細解釋,請戳 詳細介紹 include include includeusing namespace std int a 1000000 int b 1000000 int sum 0 void merge int ...