題目大意:
給定一列n<=200000個數,求氣泡排序k輪後的結果。
思路:妙哉我把題面給的暴力寫錯了
好先看部分分
資料隨機?好像一列數是遞增的那麼他們之間的相對順序不會變,因此可以縮成乙個點,每次把乙個點中的最大值加入到下乙個點當中。
乙個優化是當當前點的最大值<下乙個點的最小值的時候就把這兩個點合併成乙個。
好我就很開心的寫了不是很多人會的左偏樹開森
然後發現並沒有必要用堆這個性質
直接用鍊錶套陣列隨便xjb搞一搞就可以。
我花了兩個小時成功的讓我的**多了乙個log。真棒
然後開始考慮怎麼做。
不難發現乙個點的最終位置的計算是近似於下面的方法(細節略有出入)
首先看他前面有幾個比他大的數字,並和k取min,記為p,這個就是這個點要向前移動多少位。
這個顯然是可以用線段樹/樹狀陣列/平衡樹來維護的。
手玩發現前p輪這個點每輪向前移動1.所以只有k-p輪可以用來向後移。
手玩發現這個點向後移多少,就是從它和之後第k-p個比他大的數字之間比他小的數字的個數。
怎麼想到的就是,每次他都會停在上一輪第乙個比他大的數 前乙個位置。
然後發現儘管前面比他大的數字會跑到後面但是貌似沒有影響。
發現這個顯然可以用splay維護但是set裡面沒有這個函式。(牛神說可以用set水過?待補)
而我又不會寫splay!!!
然後考慮用線段樹。顯然可以二分然後區間求和這樣是兩個log。直覺告訴我有更好的做法。
然後想了想我們可以再線段樹上二分然後就開始寫。快寫完了才發現對於每個區間都可能要求區間和所以複雜度依舊是兩個log
方,棄療
然後想了想可以用主席樹來維護,這樣就可以在上面二分做到乙個log。
但是只剩下不到乙個小時所以繼續棄療。
sjk說他有30行**的乙個log做法。
我好方啊我去。
第二題丁神說什麼行列式第三題田神說什麼fft那我也是很無奈啊
關於這個題的兩種做法。
第一種,觀察每個點的位移,分為兩部分,向前和向後。維護當前這個數之前有多少個數大於這個數,不妨記為c。
如果c>=k那麼這個店向前位移k,顯然,最終位置為i-k。
否則手玩返現就是這個點與之後第k-c個比他大的點之間比他小的數量。
但是注意到離散化後如果強制使兩個數字不同並且從大到小操作
那麼這個數的之後第k-c個比他大的點就是序列上沒加入這個點時序列上第k個數。
然後輸出即可。複雜度o(nlgn)。
第二種做法,注意到每個區間的最小值不會成為影響。
首先看[1,k+1],其中的最小值跑到了第乙個,然後剩下的k個數字和第k+2個數字放一塊取個最小值……
然後可以歸納證明這樣是對的。
首先第乙個點是顯然正確的。
然後對區間位置歸納,假定當前處理到區間[l,r]然後[1,l]的序列確定,考慮新加入乙個點,由於前面的序列已經確定那麼這個區間顯然也是正確的。
所以用堆來維護即可。複雜度o(nlgn)實測比線段樹常數略小。
2023年,乙個新的開端
但凡人事,預則立,不預則廢。有乙個能力上可以接近的目標,有乙個行得通的計畫,對於實現期望目標是很有必要的。在確立目標和指定計畫之前,先對過去的一些情況做乙個概括性的總結。二零一六年,對於我來說,很多事情開始慢慢變好。還記得剛畢業的時候,整個人都是異常緊張的,經歷了很多。從找工作時的迷茫,初為人父時的...
2023年的部落格之路開始 下乙個十年
十 年 從2006年畢業,至2016年已經整整十年,這十年是我人生打基礎的十年,從06年懷揣2000元現金到上海獨自闖蕩,經過07年 08年的工作努力,使自己有了安身立命的本領,這3年是我學習知識最多的3年,從大學的乙隻小白鼠成長為專案組的骨幹,有幸運,有朋友的幫助,也有自己的辛勤努力,感謝我遇到的...
乙個醫藥代表的三年
來自 噴嚏網 讀書 培訓 8小時外的健康生活 之 鉑程齋 xilei發表 收錄於昨天 7分享 4月10日早晨8點整,呂雯像上班一樣,出現在北京某醫院門診部門口。下午5點,下班 了,呂雯離開醫院,回家。這樣的 作息時間 已經執行了半個月。半個月前,公司下達了新的藥品開發任務。從那以後,她每天都要泡在這...