51Nod 1019 逆序數 逆序偶 歸併排序

2021-08-30 23:58:59 字數 1636 閱讀 5429

1019 逆序數 

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

如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示例42

431output示例

4**1(線段樹):

#include#include#include#include #include #include using namespace std;

const int maxn=5e4+100;

#define ll long long

int a[maxn];

int x[maxn];

struct tree

tree[maxn<<2];

void build(int l,int r,int root)

int query(int l,int r,int root)

int mid=tree[root].left+tree[root].right>>1;

if(l>mid)

return query(l,r,root<<1|1);

else if(r<=mid)

return query(l,r,root<<1);

else

return query(l,mid,root<<1)+query(mid+1,r,root<<1|1);

}//包含id的區間都加1

void update(int id,int root)

int mid=tree[root].left+tree[root].right>>1;

if(mid>=id) update(id,root<<1);

else update(id,root<<1|1);

}int bin(int key,int n)

return -1;

}int main()

build(0,m,1);

ll sum=0;

for(int i=0;i解法2(歸併演算法):(拷了海島的**)

/* 51nod-1019 逆序數 */

#include using namespace std;

const int n = 50000;

int a[n], temp[n], cnt;

void merge(int low, int middle, int high)

}while(i <= middle)

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

while(j <= high)

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

for(i=low; i<=high; i++)

a[i] = temp[i];}

void mergesort(int low, int high)}

int main()

return 0;

}

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

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

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為序列的長...