排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家
樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍
高低錯亂,極不美觀。設第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個...