求逆序數 歸併排序 (模板)

2021-07-22 20:50:25 字數 1305 閱讀 4415

之前不知道逆序數是什麼,今天才了解了一下,主要樸素的方法是n^2的,所以可以用歸併排序,線段樹還有樹狀陣列三種方法來做。

先學了歸併排序的做法,發現還是挺簡單的。~~

#include#include#includeusing namespace std;

const int maxn = 5e5+5;

int num[maxn],p[maxn];

long long cnt;

void hhsort(int *num,int left,int mid,int right,int *p)

}while(i <= mid)

p[k++] = num[i++];

while(j <= right)

p[k++] = num[j++];

for(i = 0;i < k;i++)

num[left + i] = p[i];

}void qqsort(int *num,int left,int right,int *p)

}int main()

return 0;

}

後面再補上樹狀陣列的方法--------------

還是忘了開long long wa了一發,orz。

樹狀陣列的做法主要是要了解乙個方法,定義乙個為0的陣列p【n】,把給的數列按從大到小的順序插,插入乙個就把當前位置p【i】+1,再看p【i】之前有木有插過數字,即getsum(i-1).,最後把這些都加起來,就是逆序數的個數,最後的總數加起來會爆int,所以別忘了cnt定義為longlong~

樹狀陣列寫起來就是很短,不錯~

#include#include#include#includeusing namespace std;

struct nu num[500005];

int n,p[500005];

long long cnt;

bool cmp(nu a,nu b)

int lowbit(int t)

int getsum(int t)

return tt;

}void add(int t,int x)

cnt += getsum(ss-1);

}int main()

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

cnt = 0;

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

printf("%i64d\n",cnt);

}return 0;

}

求逆序數 逆序數 歸併排序

求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...

歸併排序 求逆序數

首先需要了解逆序對的概念 如果在乙個序列 數列中,滿足 則ax和ay稱為一對逆序對。現在考慮乙個問題 對乙個大小為n 即有n個元素 元素隨機無序且唯一的整數序列中,平均有多少個逆序對?乙個構造證明的方法如下 設乙個隨機無序且元素唯一的整數序列為 我們令lr為l的反向序列,即 然後在lr中任取兩個數,...

歸併排序求逆序數

輸入 n 陣列中元素個數 x 最後所存在的每對逆序對所需要花費的錢 y 按任意順序交換陣列中相鄰兩個元素所要花費的錢 n個陣列中元素 輸出 求使陣列變為公升序所需要的最少 即求該陣列的逆序數 按陣列順序 任意順序交換次數均為該陣列的逆序數次 歸併排序求逆序數 歸併排序採用分治策略 ex 重點在於合併...