求逆序對(歸併排序 樹狀陣列)

2021-09-30 16:36:18 字數 886 閱讀 8066

兩種演算法的時間複雜度都是:o(nlogn)

但是,有可能樹狀陣列需要離散化!

所以,由許多元素共同影響下,歸併排序求逆序對   比   樹狀陣列求逆序對  

歸併排序:

#include #define ll long long

#define n 100005

using namespace std;

int a[n],tmp[n];

ll ans;

int n;

inline void merge(int l,int m,int r)

else

}while(i <= m) tmp[k++] = a[i++];

while(j <= r) tmp[k++] = a[j++];

for(int i=l;i<=r;i++) a[i]=tmp[i];

}void merge_sort(int l,int r)

void add(int u,int v)

}ll query(int y)

return ans;

}struct node

a[n];

ll seq[n];

int cmp(node x,node y)

int main()

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

int tt=0;

for (int i = 1;i <= n;i++) //離散化

seq[a[i].num]=++tt;

} ll cnt=0;

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

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

return 0 ;

}

求逆序對 樹狀陣列 歸併排序模板

ps 但資料大的時候,需要離散化陣列會多乙個排序的複雜的,其實還不如歸併找逆序對塊 歸併找逆序對也是o n logn 樹狀陣列 include include include include include include includeusing namespace std const int i...

逆序對 (樹狀陣列 歸併排序

陣列前面的乙個元素 大於等於 後面的乙個元素就是乙個逆序對 樹狀陣列可以快速求字首和,利用這一特性,可以求逆序對個數,見下 用陣列c i 記錄陣列a n 中i這一元素出現的次數 當a n 中元素較大時可以離散化處理。將a n 從a n 1 到a 0 依次存到樹狀陣列中,每存乙個,對存的元素i求一次c...

歸併排序求逆序對

排序都用qsort了,別的排序演算法不怎麼用,但有些排序的思想很重要。碰到一道求逆序對的題,要用到歸併排序,學習了一下歸併排序。歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 將n個元素分成個含n 2個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...