給定乙個序列 $a$ ,先輸出原先的逆序對數。
然後 $m$ 次操作,每次交換兩個數,並輸出交換後的逆序對數。
$1≤m≤2\times 10^3,1≤n≤2\times 10^4,1≤a_i≤10^9$
離散化。
分個塊。
對於每乙個字首塊和字尾塊搞乙個樹狀陣列,維護一下每種值的個數的字首和。
考慮刪除和增加操作,就是修改塊內資訊和統計塊內塊外資訊。
統計塊內資訊直接暴力。
統計塊外資訊通過預處理的字首塊和字尾塊樹狀陣列來快速搞定。
可以寫乙個子程式把四個東西壓起來。
但是我這樣的做法需要注意一點:交換的兩個數字在同一塊內的時候,貢獻會被算兩遍。
#include using namespace std;const int n=20005;
int n,m,a[n],ha[n],hs;
int lv[45][n],rv[45][n];
void hash()
void add(int *c,int x,int d)
int sum(int *c,int x)
int solve0(int *c,int *a,int n)
return ans;
}int update(int x,int d)
scanf("%d",&m);
printf("%d\n",ans);
while (m--)
swap(a[x],a[y]);
ans+=update(x,1);
ans+=update(y,1);
printf("%d\n",ans);
} return 0;
}
BZOJ2141 排隊 分塊,樹狀陣列
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家 樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍 高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,...
bzoj 2141 排隊 (樹狀陣列套線段樹)
題目大意 給出乙個序列,每次交換兩個位置的數,求交換完後整個序列的逆序對數。對於乙個位置會產生的逆序對數是他前面比他大的數 他後面比他小的數。我們可以用樹狀陣列套線段樹維護一下,外層表示位置在樹狀陣列中該點的控制區間,線段樹是權值線段樹。然後每次交換完了計算一下就可以了。include includ...
BZOJ 2141 排隊 分塊 Treap
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,j ...