bzoj2141 分塊套樹狀陣列 樹套樹

2021-08-09 21:05:56 字數 1263 閱讀 1311

題意:動態維護逆序對,每次會交換兩個數。

首先離散一波。

然後這題其實很顯然,分塊處理先,然後對於每次交換,只有在x,y之間的才有用。

那麼在bl[x]+1和bl[y]-1之間的數都是整塊,可以直接用bit維護。

否則就是乙個塊內的,就可以直接暴力維護了。

感覺我的實現姿勢不好,寫的很醜,看了po姐的感覺慚愧。。於是重新來一了幾發。

樹套樹也可以做。以後回來填坑。

#include#include#include#include#define fo(i,a,b) for(int i=a

;i<=b;i++)

#define fd(i,a,b) for(int i=a

;i>=b;i--)

using namespace std;

const int n=1e5+5

;int bl[n],n,m;

int cnt[200][n],pre[n],a[n],ans;

struct node

b[n];

bool cmp(node a,node b)

inline int lowbit(int x)

inline void add(int t,int x)

}inline void decrease(int t,int x)

}inline int get(int t,int x)

return ans;

}int main()

fd(i,n,1)

int c=sqrt(n);

//int c=static_cast(sqrt(n)+1e-7);

fo(i,1,n)add(cnt[(i-1)/c],a[i]);

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

scanf("%d",&m);

while (m--)

fo(i,x+1,l*c)

fo(i,(r+1)*c+1,y-1)

}else

}if (a[x]>a[y])ans--;

else

if (a[x]decrease(cnt[(x-1)/c],a[x]);

decrease(cnt[(y-1)/c],a[y]);

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

add(cnt[(x-1)/c],a[x]);

add(cnt[(y-1)/c],a[y]);

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

}}

BZOJ2141 排隊 分塊,樹狀陣列

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

BZOJ2141 排隊 樹狀陣列 分塊

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

bzoj 2141 排隊 (樹狀陣列套線段樹)

題目大意 給出乙個序列,每次交換兩個位置的數,求交換完後整個序列的逆序對數。對於乙個位置會產生的逆序對數是他前面比他大的數 他後面比他小的數。我們可以用樹狀陣列套線段樹維護一下,外層表示位置在樹狀陣列中該點的控制區間,線段樹是權值線段樹。然後每次交換完了計算一下就可以了。include includ...