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個數分塊,a[x] 或者(a[y])(這一步可以等價處理(小技巧))
考慮樹狀陣列
但此時若用分塊處理會更快
對於資料權值分塊
ha[k][i] 代表第k塊數中 小於base*i的數的個數 同時用pre[k][i]表第k塊數中 <=i && >base*(i/base)的數的個數,以此記錄分塊兩邊較小的區間
**:#include//塊套塊
using namespace std;
const int maxn=500000;
long long n,m,cnt,u,v,a[maxn],b[maxn],sum[maxn],ha[201][201],pre[201][20001],k1,k2,k3,block;
long long query(int x)
void add(int x)
int getblock(int x)
void change(int k,int zhi,int an) //對於當前塊進行處理
int ask(int l,int r,int zhi)
} else
} for (int i=(k2-1)*block+1;i<=r;i++)
} k3=getblock(zhi);
for (int i=k1+1;i>n;
for (int i=1;i<=n;i++)
sort(a+1,a+1+n);
for (int i=1;i<=n;i++)
for (int i=1;i<=n;i++)
block=200;
cout<>m;
for (int i=1;i<=m;i++)
{ cin>>u>>v;
if (b[u]==b[v]) { coutcnt+=ask(u+1,v-1,b[u]);//找u+1--v-1區間內比b[u]小的個數減去比b[u]大的個數
cnt-=ask(u+1,v-1,b[v]);
if (b[u]>b[v]) cnt++; else cnt--;
change(getblock(u),b[u],-1); change(getblock(v),b[v],-1);
change(getblock(v),b[u],1); change(getblock(u),b[v],1);
swap(b[u],b[v]);
cout<
分塊入門 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個...
BZOJ 2141 排隊 分塊 Treap
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,j ...
BZOJ2141 排隊 分塊,樹狀陣列
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家 樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍 高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,...