兩種演算法的時間複雜度都是: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個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...