分塊入門 bzoj2141排隊

2022-09-23 16:57:10 字數 1429 閱讀 5240

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,...