51nod 1019 逆序數(逆序數 離散化)

2022-04-16 03:16:10 字數 1112 閱讀 9012

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

如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。

input

第1行:n,n為序列的長度(n <= 50000)

第2 - n + 1行:序列中的元素(0 <= a[i] <= 10^9)

output

輸出逆序數
input示例

424

31

output示例

4

思路:本題的題意較為簡單,起初一組數中的逆序對的數量。其中的關鍵是對離散化的理解。離散化在這個過程中感覺更像是在記錄了原來的先後順序的情況下按照數值大小再次排序,這樣在判斷逆序對的時候可以以n的複雜度順序判斷,而不需要n^2判斷。

ac**:

#include #include 

#include

using

namespace

std;

const

int maxn=50005

;int

n;int

hash[maxn];

struct

nodenode[maxn];

inttree[maxn];

bool

cmp(node a,node b)

int lowbit(int

i)void add(int x,intv)}

int getsum(int

i)

returns;}

intmain()

//離散化 ,hash[i]裡存的是v的值為i的node在全部node中以v排序後的排名 (由小到大)

sort(node+1,node+1+n,cmp);

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

int res=0

;

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

cout

}

51nod 1019 逆序數(樹狀陣列)

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。input 第1行 n,n為序列的長度 n 5000...

51Nod 1019 逆序數 分治

51nod 1019 逆序數 分治法 如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。收起第1行 n,n為序列的長...

逆序數 51nod 1019 歸併 分治

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。input 第1行 n,n為序列的長度 n 5000...