逆序對 權值線段樹

2021-07-27 20:11:37 字數 943 閱讀 6333

這幾天考試考得心裡頗不寧靜,來水篇部落格散散心。

好滴,接下來,我們進入正題--

相信許多人都知道逆序對吧,傳說中歸併排序的方法在這先不講,我們來了解一下用權值線段樹如何解決這個問題:

首先,我們需預處理,得到每個值在權值線段樹中的位置;

然後,按順序將數字(a[i])插入到樹中相應的位置(id[a[i]]),接著詢問樹中比它大的元素個數(id[a[i]]+1~n),容易知道這些數都與當前的數(a[i])形成逆序對,將它累加到答案(ans)裡就行啦,很簡單吧!

**如下:

#include

#include

#include

#include

#define for(aa,bb,cc) for(int aa=bb;aa<=cc;++aa)

#define maxn 50001

#define ls node<<1

#define rs node<<1|1

using

namespace

std;

int n,a[maxn];

struct nodenow[maxn];

int e,id[maxn],tree[maxn<<2];

inline

bool cmp(node a,node b)

}inline

void insert(int node,int x,int l=1,int r=e)

inline

int query(int node,int z,int y,int l=1,int r=e)

inline

void solve()

printf("%d",ans);

}int main()

大家若想更深了解權值線段樹,就看看這篇吧(kpi的權值線段樹解法)

codevs1688 求逆序對 權值線段樹

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目 資料範圍 n 105。ai 105。時間限制為1s。輸入描述 input description 第一行為n,表示序列長度,接下來...

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...

權值線段樹

include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...