題意:給出乙個序列,可以相鄰的交換k次,求 k 次之後,逆序數對最少是多少;
分析:可以發現,無論怎麼交換之後,總共的逆序數對只會-1,那麼結果就是,將這個序列排整齊時,要兩兩交換的次數-k;題目就轉換為求這個序列的逆序數對有多少;
這樣的兩兩交換好像是氣泡排序,氣泡排序是o(n^2);
正確解法是歸併排序;當我們合併兩個有序序列時,如果,要將後面的插入到前乙個中間,那麼這裡就有m-i+1個逆序數對;
1 #include 2view code3using
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 }
逆序數對 (常規)
求下列數列中逆序數對最少的乙個,並求出逆序數對數量?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...