考虑以下几个问题:
将一个序列排序
某神仙: (mathtt{sort}) !!!
每次取出最前面的两个数
某神仙: (a_i) 和 (a_{i+1}) 啊!!
相加,再加入序列
某神仙:...... for 循环乱搞啊!
保持序列的有序性
某神仙:(声音逐渐变弱)再搞一次 (mathtt{sort}) 呗。
(n≤10000),请注意程序的时间复杂度
某神仙:卒(
于是,这就需要用到 STL queue 中的 (mathtt{priority\_queue})了!!!
唯一需要注意的地方是 (mathtt{priority\_queue}) 的定义,即
小根堆:priority_queue<int,vector<int>,greater<int> > q;
大根堆:priority_queue<int,vector<int>,less<int> > q;
其中第一个 int
表示优先队列存放的数据类型, vector<int>
表示存放的方式是数组, greater<int>
表示小根堆(从小到大),less<int>
表示大根堆(从大到小)。注意最后的两个 >>
要写成 > >
,否则可能会被编译器误认为位运算右移符号。
然后就是很基础的操作了:
q.push(x) //在优先队列中插入x O(logN)
q.top() //取出队首的元素 O(1)
q.pop() //令队首出队 O(logN)
q.empty() //判断队列是否为空
q.size() //队列中元素的数量