考虑以下几个问题:
将一个序列排序
某神仙: \(\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() //队列中元素的数量
来源:https://www.cnblogs.com/Nicest1919/p/12309462.html