BZOJ 2141 排隊 分塊 Treap

2021-07-27 15:05:02 字數 2384 閱讀 5207

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為:滿足ihj的(i,j)數量。幼兒園阿姨每次會選出兩個小朋友,交換他們的位置,請你幫忙計算出每次交換後,序列的雜亂程度。為方便幼兒園阿姨統計,在未進行任何交換操作時,你也應該輸出該序列的雜亂程度。

第一行為乙個正整數n,表示小朋友的數量;第二行包含n個由空格分隔的正整數h1,h2,…,hn,依次表示初始佇列中小朋友的身高;第三行為乙個正整數m,表示交換操作的次數;以下m行每行包含兩個正整數ai和bi¬,表示交換位置ai與位置bi的小朋友。

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

【樣例輸入】

3 130 150 140

2 2 3

1 31

0 3

【樣例說明】

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

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

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

【資料規模和約定】

對於100%的資料,1≤m≤2*103,1≤n≤2*104,1≤hi≤109,ai≠bi,1≤ai,bi≤n。

先分塊,在對每乙個塊寫乙個treap,維護每個treap即可。

交換位置時只需要掃瞄他們之間的數和塊即可。

詳細可見我通俗易懂的**。

#include

#include

#include

#include

#include

using

namespace

std;

#define n 20010

struct node

int cmp(int x)

void maintain()

}*root[150];

void rotate(node* &o,int d)

void insert(node* &o,int x)

else

}o->maintain();

}void remove(node* &o,int x)

node* u = o;

if(o->ch[0] && o->ch[1])

else

}else remove(o->ch[d],x);

if(o)o->maintain();

}int find(node *o,int x)//查詢乙個塊中比x大的數有多少個

return ans;

}int findsmall(node *o,int x)//查詢乙個塊中比x小的數有多少個

return ans;

}int n,blen,cnt,x,y,m;

int l[150],r[150],belong[n],h[n];

int main()

r[cnt] = n;

for(int i = 1;i <= n;i++) belong[i] = (i-1)/blen + 1;

//belong判斷i在第幾個塊中

int ans = 0;

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

printf("%d\n",ans);

scanf("%d",&m);

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

int a = belong[x],b = belong[y];

if(a == b)

if(h[x] < h[y]) ans++;

if(h[x] > h[y]) ans--;

printf("%d\n",ans);

swap(h[x],h[y]);

continue;

}for(int j = x+1;j <= r[a];j++)

for(int j = l[b];j <= y-1;j++)

for(int j = a+1;j <= b-1;j++)

if(h[x] < h[y]) ans++;

if(h[x] > h[y]) ans--;

printf("%d\n",ans);

remove(root[a],h[x]);insert(root[a],h[y]);

remove(root[b],h[y]);insert(root[b],h[x]);

swap(h[x],h[y]);//一定要記得交換位置

}return

0;}

分塊入門 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個...

分塊入門 bzoj2141排隊

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

BZOJ2141 排隊 分塊,樹狀陣列

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