洛谷 P1801 黑匣子

2022-08-15 20:36:12 字數 559 閱讀 2628

好像很久沒有更過部落格了,因為博主這幾周很忙。其實是在搞頹。

題意很難懂,所以就不重複了。其實是懶。

一眼看上去這是個 \(splay\) 裸題,直接插入乙個數,查詢區間第 \(k\) 大,但是這樣太不優美了,配不上「noi導刊」這幾個字,所以這題肯定有更優美的做法。

注意到這道題有乙個很優美的性質,\(k\) 是遞增的,然後我們就可以搞事情了。

開兩個堆,乙個大根堆,乙個小根堆。大根堆裡存的是前 \(k\) 小的數。

每次插入乙個數,判斷是否比大根堆的堆頂要小,是就把堆頂丟回小根堆,當前數如入大根堆,否則直接丟小根堆。單次插入是 \(o(log_n)\) 的,總複雜度 \(o(nlog_2n)\)。

這道題我開始是手寫的 \(heap\),沒有壓常數,\(112ms\)。

然後我大力加一波 \(register\),\(188ms\)。

不要全部加,刪掉幾個\(116 \sim 144ms\)不等。

怒改 \(stl + register\),\(116ms\)。

我想我該好好學習一下卡常技巧,不能越卡越慢……

**常數太醜,就不貼了。

洛谷P1801 黑匣子

題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...

洛谷P1801 黑匣子

題目鏈結 看到題解中 維護兩個堆 突然想到了這道題的解法 維護兩個堆 大根堆h1,小根堆h2 大根堆裡的是最小的i個值,小根堆裡是剩下的值 每add乙個值時 插入到小根堆中,再比較小根堆的最小值與大根堆的最大值 若h2.top 將兩個元素取出,換一下再放進去 需要get時 將h2.top 取出,放進...

洛谷P1801 黑匣子

long long就果然還是就該用cout,沒有lld的ll留下了悔恨的眼淚 鏈結一放,要看什麼對頂堆的走開走開,我只會離散化加權值樹狀陣列 首先吧,這個詢問依次遞增就友善的一批,然後詢問某刻第k位,我們用權值樹狀陣列。首先如果i有,那麼在陣列中下標為i的位置就打成1,沒有就是0,樹狀陣列裡面存的是...