BZOJ2141 排隊 分塊,樹狀陣列

2022-09-14 16:15:21 字數 1784 閱讀 7184

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家

樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍

高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為:滿足ihj的(i,j)數量。幼兒

園阿姨每次會選出兩個小朋友,交換他們的位置,請你幫忙計算出每次交換後,序列的雜亂程度。為方便幼兒園阿

姨統計,在未進行任何交換操作時,你也應該輸出該序列的雜亂程度。

第一行為乙個正整數n,表示小朋友的數量;

第二行包含n個由空格分隔的正整數h1,h2,…,hn,依次表示初始佇列中小朋友的身高;

第三行為乙個正整數m,表示交換操作的次數;

以下m行每行包含兩個正整數ai和bi,表示交換位置ai與位置bi的小朋友。

1≤m≤2*10^3,1≤n≤2*104,1≤hi≤109,ai≠bi,1≤ai,bi≤n。

輸出檔案共m行,第i行乙個正整數表示交換操作i結束後,序列的雜亂程度。

【樣例輸入】

3130 150 140

22 3

1 3103

【樣例說明】

未進行任何操作時,(2,3)滿足條件;

操作1結束後,序列為130 140 150,不存在滿足ihj的(i,j)對;

操作2結束後,序列為150 140 130,(1,2),(1,3),(2,3)共3對滿足條件的(i,j)

首先上來先離散化一下。

可以發現,交換兩個位置對答案的影響只和兩個位置中間的數的大小有關

所以可以分塊加樹狀陣列,兩端零碎的暴力統計,中間成塊的每一塊開乙個樹狀陣列,就可以統計比兩端大/小的數的個數了。

1 #include2 #include3 #include4 #include5 #include6

#define n (20000+100)

7using

namespace

std;89

intn,m,unit,num,bnum,ans,l,r;

10int

a[n],b[n],l[n],r[n],id[n];

1112

struct

node

1316

void update(int x,int v)

17int query(int x)

18 }t[150

];19

20void

init()

2128

29void

build()

3040

41void check(int x,int l,int

r)42

4849

void solve(int l,int

r)50

61for (int i=l+1; i<=r[id[l]]; ++i) check(i,l,r);

62for (int i=l[id[r]]; i<=r-1; ++i) check(i,l,r);

63for (int i=id[l]+1; i<=id[r]-1; ++i)

6471 printf("

%d\n

",ans);72}

7374

intmain()

7585 printf("

%d\n

",ans);

86 scanf("

%d",&m);

87for (int i=1; i<=m; ++i)

8892 }

BZOJ2141 排隊 樹狀陣列 分塊

給定乙個序列 a 先輸出原先的逆序對數。然後 m 次操作,每次交換兩個數,並輸出交換後的逆序對數。1 m 2 times 10 3,1 n 2 times 10 4,1 a i 10 9 離散化。分個塊。對於每乙個字首塊和字尾塊搞乙個樹狀陣列,維護一下每種值的個數的字首和。考慮刪除和增加操作,就是修...

BZOJ 2141 排隊 分塊 Treap

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,j ...

分塊入門 bzoj2141排隊

to infinity and beyond.wall e 首先可以用離散化 樹狀陣列來計算逆序對個數 時間複雜度 n log n 對於有關逆序對的題目,首先可以想到逆序對的特質 然後對於每個詢問 x,y xa i a i a x ans a i a i a y ans 此時想到用分塊處理 對於n個...