HDU 4944 逆序數對

2022-04-01 07:17:56 字數 704 閱讀 1439

題意:給出乙個序列,可以相鄰的交換k次,求 k 次之後,逆序數對最少是多少;

分析:可以發現,無論怎麼交換之後,總共的逆序數對只會-1,那麼結果就是,將這個序列排整齊時,要兩兩交換的次數-k;題目就轉換為求這個序列的逆序數對有多少;

這樣的兩兩交換好像是氣泡排序,氣泡排序是o(n^2);

正確解法是歸併排序;當我們合併兩個有序序列時,如果,要將後面的插入到前乙個中間,那麼這裡就有m-i+1個逆序數對;

1 #include 2

3using

namespace

std;45

const

int maxn = 1e5 + 5;6

7__int64 cnt,k;

8int

a[maxn],c[maxn];910

11void merge(int* a,int first,int mid,int last,int*c)

19else23}

24for(i=0;i)

25 a[first+i] =c[i];26}

2728

void mergesort(int* a,int first,int last,int*c) 35}

3637

intmain()

3848

return0;

49 }

view code

逆序數對 (常規)

求下列數列中逆序數對最少的乙個,並求出逆序數對數量?n 5000 a1,a2,an 1,an a2,a3,an,a1 a3,a4,an,a1,a2 an,a1,a2,an 1 pragma warning disable 4786 include includeusing namespace std...

求逆序數對

題意 給出長度為n的序列,每次只能交換相鄰的兩個元素,問至少要交換幾次才使得該序列為遞增序列。1.先對輸入的陣列離散化,使得各個元素比較接近,而不是離散的 a的操作就是離散化 2.接著,運用樹狀陣列的標準操作來累計陣列的逆序數。include iostream include cstdio incl...

樹狀陣列求逆序對(逆序數)

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