求數列的逆序數

2021-09-25 21:23:24 字數 1762 閱讀 9683

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

28

ll a[500005],tem[500005],ans;       //a為要求的序列,tem是臨時存放的陣列

void

divide

(int low,int high)

//子串行

else

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

}while(i<=mid) tem[k++]=a[i++]; //將剩下的存入陣列

while(j<=high) tem[k++]=a[j++];

for(int t=low;t<=high;t++) a[t]=tem[t]; //更新a陣列

return;

}

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

#include

#include

#include

using

namespace

std;

#define crl(a) memset(a,0,sizeof(a))

#define lowbit(x) (x&(-x))

#define inf 0xffffffff

typedef

long

long ll;

const

int n=5e5+5;

int tr[n],b[n],n;

typedef pair int> pp;

pp a[n];

void

update

(int x)

//插入x

}int

query

(int x)

//查詢序列中比x小的有多少個

return sum;

}int

main

()sort(a+1,a+n+1);

for(int i=1;i<=n;i++) b[a[i].second]=i; //離散化結束,b陣列即是離散化後的陣列

ll ans=0;

for(int i=1;i<=n;i++)

cout

}return0;}

求陣列的逆序數

題目 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就是1。方法1 o n 2 這個就不說了。方法2 借助歸併排序達到o...

分治演算法 求陣列逆序數

題目 在陣列中的兩個數字如果前面乙個數字大於後面乙個數字 則這兩個數字組成乙個逆序對 輸入乙個陣列 求這個陣列中逆序對的個數 先把陣列分割成子陣列 先統計出子陣列內部的逆序對的數目 然後再統計出兩個相鄰子陣列之間的逆序對的數目 統計逆序對的過程中 還需要對陣列進行排序 這類似與歸併排序 演算法的時間...

輸出乙個數列的逆序數

1,這個問題演算法導論講歸併排序時,提到過。找到乙個實現 思路還是蠻清晰的。核心 對於兩個有序序列,找逆序對,遍歷一次即可。2,實現 include include using namespace std int inv int data,int n ret j tmp i j data i 不是逆...