複習 樹狀陣列求逆序對 光榮的夢想

2021-08-09 06:43:33 字數 1630 閱讀 8892

題目描述

prince對他在這片大陸上維護的秩序感到滿意,於是決定啟程離開艾澤拉斯。在他動身之前,prince決定賦予king_bette最強大的能量以守護世界、保衛這裡的平衡與和諧。在那個時代,平衡是個夢想。因為有很多奇異的物種擁有各種不穩定的能量,平衡瞬間即被打破。kb決定求助於你,幫助他完成這個夢想。

一串數列即表示乙個世界的狀態。

平衡是指這串數列以公升序排列,而從一串無序數列到有序數列需要通過交換數列中的元素來實現。kb的能量只能交換相鄰兩個數字。他想知道他最少需要交換幾次就能使數列有序。

輸入格式

第一行為數列中數的個數 n(n≤100000)。

第二行為 n 個數a1

~an (每個數小於100000),表示當前數列的狀態。

輸出格式

輸出乙個整數,表示最少需要交換幾次能達到平衡狀態。

樣例資料

輸入

4

2 1 4 3

輸出

備註

本題另外一種描述:

給定乙個序列a1

,a2,

…,an

,如果存在

i<

j 並且ai

>aj

,那麼我們稱之為逆序對,求逆序對的數目。

分析:樹狀陣列求逆序對模板。**比較難想,其實就是說每個數前面數的總數減去現在它前面小於它的數的個數,得到了大於它的數的個數,也就是逆序對數。

好吧,其實不難想,之前在想c[i]是幹嘛用的,結果只是離散化了一下。這道題資料夠小,不用c不sort直接把a往樹狀陣列裡放都可以(記得把陣列開大)。

**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int getint()

for(;isdigit(ch);ch=getchar())

sum=(sum<<3)+(sum<<1)+ch-48;

return sum*f;

}const

int maxn=100010;

struct nodea[maxn];

int n,sum[maxn],c[maxn];

long

long ans;

bool comp(const node &a,const node &b)

void update(int x)

int query(int x)

int main()

cout

<'\n';

return

0;}

本題結。

光榮的夢想 (樹狀陣列求逆序數和)

題目描述 prince對他在這片大陸上維護的秩序感到滿意,於是決定啟程離開艾澤拉斯。在他動身之前,prince決定賦予king bette最強大的能量以守護世界 保衛這裡的平衡與和諧。在那個時代,平衡是個夢想。因為有很多奇異的物種擁有各種不穩定的能量,平衡瞬間即被打破。kb決定求助於你,幫助他完成這...

樹狀陣列求逆序數

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

樹狀陣列求逆序對

題目描述 給定乙個陣列a,它包含n個整數,分別是a 1 a 2 a n 如果存在下標i和j,使得 i j 且 a i a j 同時成立,則 i,j 就為乙個 逆序對 那麼a陣列總共有多少對不同的 逆序對 輸入格式 1247.in 第一行為n 1 n 100000 接下來是n行,每行乙個長整型範圍內的...