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 ...