樹狀陣列求逆序對(逆序數)

2021-08-21 18:44:11 字數 1893 閱讀 8303

逆序數(也叫逆序對)

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。

無重複的數

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 500000

typedef

long

long ll;

ll c[max];

ll n;

struct record

num[max];

bool cmp(record a,record b)

ll lowbit(ll x)

ll sum(ll x)//求和

return s;

}void update(ll x)//更新

}int main()

sort(num, num+n, cmp);

ans = 0;

for(i = 0;i < n; ++i)//每一次插入當前最大值

ll anss=ans*min(x,y);

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

}}

有重複的數

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 500000

typedef

long

long ll;

ll c[max];

ll n;

struct record

num[max];

bool cmp(record a, record b)

ll lowbit(ll x)

ll sum(ll x)//求和

return s;

}void update(ll x)//更新

}int main()

sort(num, num+n, cmp);

ans = 0;

for(i = 0;i < n; ++i)//每一次插入當前最大值

ll anss=ans*min(x,y);

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

}}

樹狀陣列求逆序數(離散化)當maxn較大時,直接開陣列顯然是不行了,這是的解決辦法就是離散化

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

ll c[100005],s[100005],a[100005],b[100005];

ll n;

ll x,y;

int lowbit(int x)

void update(ll i,int x)

}ll sum(ll x)

return sum;

}int main()

sort(b+1,b+n+1);

int len=unique(b+1,b+n+1)-b-1;

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

ll ma=min(x,y);

printf("%lld\n",ans*ma);

}}

樹狀陣列求逆序數

逆序數就是數中各位在它前面有多少個數比它大,求出這些元素個數之和。今天看了個樹狀陣列,可以很好的解決這個問題,普通方法需要o n 2 複雜度,用樹狀陣列只需要o nlongn 樹狀陣列實際上還是乙個陣列,只不過它的每個元素儲存了跟原來陣列的一些元素相關的結合值。若a為原陣列,定義陣列c為樹狀陣列。c...

樹狀陣列求逆序數

chikachika說希望和我一起做學園偶像的時候,我真的很開心。watanabeyouwatanabeyou 曜是千歌的青梅竹馬,但是aqoursaqours成立以後,千歌似乎總是與梨子在一起,而把曜冷落了。為了讓千歌知曉自己的心意,曜醬決定做一件大事!她決定把乙個給定的11 nn的排列 1 ai...

樹狀陣列 求逆序數

一.樹狀陣列介紹 1 性質 樹狀陣列本質上就是乙個陣列,它與普通陣列不同之處在於它的某些元素維護的是一段區間的資訊,已區間和為例,若i為奇數,則第i個元素就是源資料的第i個元素,若i為偶數,則第i個元素維護的是 i 2 k 1,i 這段區間的和,k代表i的二進位制末尾0的個數。2 作用 樹狀陣列常用...