題意:動態維護逆序對,每次會交換兩個數。
首先離散一波。
然後這題其實很顯然,分塊處理先,然後對於每次交換,只有在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...