## [题目传送门](https://www.luogu.com.cn/problem/CF962D)
好吧,题目简单易懂,大致就是用模拟解决的。我们就用 ```priority_queue``` ,也就是优先队列来做这道题了!
大致分为几个步骤:
1. 定义排序规则
2. 输入+自动排序
3. 模拟合并过程
4. 输出
具体实现过程放在下面了:
```cpp
#include<iostream> // 输入输出
#include<algorithm> // sort
#include<queue> // 优先队列
#include<vector> // answer数组
using namespace std;
int n;
long long a[150001]; // 输入
struct Cmp{
bool operator()(int x, int y) // 排序规则
{
if(a[x] != a[y]) return a[x] > a[y];
else return x > y;
}
};
priority_queue<int, vector<int>, Cmp> pq; // 优先队列
vector<int> answer; // 答案数组
int main(){
cin >> n; // 输入n
for(int i = 1; i <= n; i++)
{
cin >> a[i]; // 输入a[i]
pq.push(i); // 推入优先队列pq
}
while(pq.size() >= 2) // 元素个数还够合并
{
int x = pq.top(); // 第一个元素
pq.pop();
int y = pq.top(); // 第二个元素
pq.pop();
if(a[x] == a[y]) // 相等就进行合并
{
a[y] *= 2; // 合并过程
pq.push(y);
}
else
{
pq.push(y); // pq再次推入y
answer.push_back(x); // 答案数组加入x
}
}
if(!pq.empty())
{
answer.push_back(pq.top()); // 最后一个
}
cout << int(answer.size()) << endl; // 答案数组元素个数
sort(answer.begin(),answer.end()); // 进行排序
for(int i : answer) // 遍历answer数组
{
cout << a[i] << " "; // 输出格式
}
cout << endl;
return 0;
}
```
###### ~~感谢观看蒟蒻的题解,另外,如果有帮助的话,球球来[这里](https://www.luogu.com.cn/blog/mk666/)看一下吧qwq~~