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

2021-09-26 09:08:44 字數 1108 閱讀 5117

ps 但資料大的時候,需要離散化陣列會多乙個排序的複雜的,其實還不如歸併找逆序對塊

歸併找逆序對也是o(n*logn)

樹狀陣列:

#include#include#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=1000000;

typedef long long ll;

vectorv;//當數值很大的時候離散化

int getid(int x)

int n,m,a[maxn];

int c[maxn];

int lowbit(int x)

void add(int id, int p)

}int sum(int id)

return ans;

}int main()

sort(v.begin(),v.end());

v.erase(unique(v.begin(),v.end()),v.end());

ll ans=0;

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

cout《歸併排序:

#include#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=1000000;

typedef long long ll;

int a[maxn];

int b[maxn];//輔助陣列

ll ans;//逆序對數

void merge_sort(int l,int r)

while(i<=mid) b[k++]=a[i++];//繼續跑完剩下的部分

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

for(int p=l;p<=r;p++) a[p]=b[p];//將b中排好的元素放回去

}int main()

return 0;

}

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

兩種演算法的時間複雜度都是 o nlogn 但是,有可能樹狀陣列需要離散化!所以,由許多元素共同影響下,歸併排序求逆序對 比 樹狀陣列求逆序對 歸併排序 include define ll long long define n 100005 using namespace std int a n t...

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

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

模板 歸併排序求逆序對

p1908 逆序對 includeusing namespace std int a 500005 int tmp 500005 long long ans 0 void mergesort int l,int r while i mid tmp tot a i while j r tmp tot ...