排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為:滿足ihj的(i,j)數量。幼兒園阿姨每次會選出兩個小朋友,交換他們的位置,請你幫忙計算出每次交換後,序列的雜亂程度。為方便幼兒園阿姨統計,在未進行任何交換操作時,你也應該輸出該序列的雜亂程度。
第一行為乙個正整數n,表示小朋友的數量;第二行包含n個由空格分隔的正整數h1,h2,…,hn,依次表示初始佇列中小朋友的身高;第三行為乙個正整數m,表示交換操作的次數;以下m行每行包含兩個正整數ai和bi¬,表示交換位置ai與位置bi的小朋友。
輸出檔案共m行,第i行乙個正整數表示交換操作i結束後,序列的雜亂程度。
【樣例輸入】
3 130 150 140
2 2 3
1 31
0 3
【樣例說明】
未進行任何操作時,(2,3)滿足條件;
操作1結束後,序列為130 140 150,不存在滿足ihj的(i,j)對;
操作2結束後,序列為150 140 130,(1,2),(1,3),(2,3)共3對滿足條件的(i,j)。
【資料規模和約定】
對於100%的資料,1≤m≤2*103,1≤n≤2*104,1≤hi≤109,ai≠bi,1≤ai,bi≤n。
先分塊,在對每乙個塊寫乙個treap,維護每個treap即可。
交換位置時只需要掃瞄他們之間的數和塊即可。
詳細可見我通俗易懂的**。
#include
#include
#include
#include
#include
using
namespace
std;
#define n 20010
struct node
int cmp(int x)
void maintain()
}*root[150];
void rotate(node* &o,int d)
void insert(node* &o,int x)
else
}o->maintain();
}void remove(node* &o,int x)
node* u = o;
if(o->ch[0] && o->ch[1])
else
}else remove(o->ch[d],x);
if(o)o->maintain();
}int find(node *o,int x)//查詢乙個塊中比x大的數有多少個
return ans;
}int findsmall(node *o,int x)//查詢乙個塊中比x小的數有多少個
return ans;
}int n,blen,cnt,x,y,m;
int l[150],r[150],belong[n],h[n];
int main()
r[cnt] = n;
for(int i = 1;i <= n;i++) belong[i] = (i-1)/blen + 1;
//belong判斷i在第幾個塊中
int ans = 0;
for(int i = 1;i <= n;i++)
printf("%d\n",ans);
scanf("%d",&m);
for(int i = 1;i <= m;i++)
int a = belong[x],b = belong[y];
if(a == b)
if(h[x] < h[y]) ans++;
if(h[x] > h[y]) ans--;
printf("%d\n",ans);
swap(h[x],h[y]);
continue;
}for(int j = x+1;j <= r[a];j++)
for(int j = l[b];j <= y-1;j++)
for(int j = a+1;j <= b-1;j++)
if(h[x] < h[y]) ans++;
if(h[x] > h[y]) ans--;
printf("%d\n",ans);
remove(root[a],h[x]);insert(root[a],h[y]);
remove(root[b],h[y]);insert(root[b],h[x]);
swap(h[x],h[y]);//一定要記得交換位置
}return
0;}
分塊入門 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個...
分塊入門 bzoj2141排隊
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...
BZOJ2141 排隊 分塊,樹狀陣列
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家 樂和和。紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍 高低錯亂,極不美觀。設第i個小朋友的身高為hi,我們定義乙個序列的雜亂程度為 滿足ihj的 i,...