有這麼一則傳聞,o(nlogn)的排序發明之前,滋滋國的排序都是採用的氣泡排序。即使是氣泡排序,對當時的國民
來說也太複雜太難以理解,於是滋滋國出現了這樣乙個職業——排序使,收取報酬並負責給序列排序。作為冒泡協
會首席排序使,lyra收費頗高,為了照顧並不富裕的人,lyra允許顧客只支付一部分酬勞並獲得並不完美的冒泡排
序服務。眾所周知,n個元素的氣泡排序需要n?1n-1輪才能完成,有一位顧客支付的費用,只能夠完成前k輪的排序
。作為氣泡排序的首席排序使,天賦卓絕的lyra暗地裡早就掌握了o(nlogn)的排序方法,這也是她輕鬆當選首席排
序使的原因——排序速度無人能敵。而現在面對只能夠完成前k輪氣泡排序的要求,lyra犯了難,於是她來尋求你
的幫助。給定乙個序列,執行如下程式:
for i from 1 to k
for j from 1 to n-1
if aj>aj+1
swap(aj,aj+1)
並輸出之後的a序列。
第一行兩個整數n,k表示序列的長度和輪數。
接下來n行每行乙個整數表示ai
1≤k輸出n行每行乙個整數表示氣泡排序k輪後的ai
3 1321
213我把冒泡的本質想錯了...然後就一直寫掛樣例都過不了
看了zz的題解才發現自己錯的好離譜...(orzz)
事實上每次氣泡排序都會把當前數前移一位(如果前面有比它大的數的話)
用樹狀陣列維護當前有幾個比它大的
如果比它大的超過$k$個那麼直接前移$k$位就好了($k$次都有比當前大的數,移動了$k$位)
最後剩下的位置一位一位地去填,從小到大填
我怎麼覺得這題主要難度在於看懂氣泡排序到底怎麼做的...(
#include usingnamespace
std ;
#define n 200010
#define lowbit( i ) i&(-i)
intans[ n ] , n , k , rk[ n ] , f[ n ] , c[ n ] ;
struct
node a[ n ] ;
//每次氣泡排序都會把當前數前移一位(如果前面有比它大的數的話)
//用樹狀陣列維護當前有幾個比它大的
//如果比它大的超過k個那麼直接前移k位就好了(k次都有比當前大的數,移動了k位)
//最後剩下的位置一位一位地去填,從小到大填
bool
cmp( node a, node b )
void add( int x , int
val )
int query( int
x )
intmain()
sort( a + 1 , a + n + 1
, cmp ) ;
rk[ a[
1 ].id ] = 1
;
for( int i = 2 ; i <= n ; i ++)
for( int i = 1 ; i <= n ; i ++)
int cur = 1
;
for( int i = 1 ; i <= n ; i ++)
}for( int i = 1 ; i <= n ; i ++)
return0;
}
bzoj1246(樹狀陣列)
樹狀陣列的靈活運用,維護的是最大值,因為整個陣列就是乙個字首最大值,所以可以用實現,求乙個字首最大值,和更新pos之後的最大值。很好的運用,多回顧思考 include include include include includeusing namespace std const int n 200...
bzoj 2762 樹狀陣列
題意 給出一些形如 ax b 1 新加入乙個不等式 2 刪除乙個不等式 3 詢問當x k時滿足的不等式的個數 對於每乙個不等式,通過變形就可以得到使它成立的x的範圍 那麼就變成區間修改,單點查詢,樹狀陣列維護就好 注意 1 討論a 0 a 0 a 0的情況 2 由於k有非正數,所以要加上10 6 1...
bzoj 1935(樹狀陣列)
傳送門 題解 由於是靜態問題所以可以離線處理,所有點 詢問拆成4個 按x排序,二維可以轉成一維,相當於每次query到的就是當前已插入的點,而只有這些點能對query的返回值造成貢獻。p.s.對於x座標相同的插入 詢問,要考慮這幾個操作的先後順序 include using namespace st...