「洛谷 P1801」黑匣子

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

原文地址:https://www.cnblogs.com/y142857/p/7806793.html