「洛谷 P1801」黑匣子
好像很久没有更过博客了,因为博主这几周很忙。其实是在搞颓。
题意很难懂,所以就不重复了。其实是懒。
一眼看上去这是个 \(Splay\) 裸题,直接插入一个数,查询区间第 \(K\) 大,但是这样太不优美了,配不上「NOI导刊」这几个字,所以这题肯定有更优美的做法。
注意到这道题有一个很优美的性质,\(K\) 是递增的,然后我们就可以搞事情了。
开两个堆,一个大根堆,一个小根堆。大根堆里存的是前 \(K\) 小的数。
每次插入一个数,判断是否比大根堆的堆顶要小,是就把堆顶丢回小根堆,当前数如入大根堆,否则直接丢小根堆。单次插入是 \(O(log_{2}n)\) 的,总复杂度 \(O(nlog_2n)\)。
这道题我开始是手写的 \(heap\),没有压常数,\(112ms\)。
然后我大力加一波 \(register\),\(188ms\)。
不要全部加,删掉几个\(116 \sim 144ms\)不等。
怒改 \(STL + register\),\(116ms\)。
我想我该好好学习一下卡常技巧,不能越卡越慢……
代码常数太丑,就不贴了。