BZOJ5170 Fable 樹狀陣列

2022-02-28 19:04:32 字數 1670 閱讀 3300

有這麼一則傳聞,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 using

namespace

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