序列变换(map+priority_queue)

题目:给出一个序列,里面的元素相同,我们要得到元素各不相同的序列,进行这样的操作:令 x 为序列重复的最小数字,你需要删除序列左数第一个 x 并把第二个 x 换成 2*x。例如原来是[2,2,1,1,1],一次变换为[2,2,2,1],两次变为[4,2,1]变换结束。

输入一个n接下来是序列的n个数字,输出最终变换的结果(最终的结果序列唯一)。

输入样例1:

3

5 4 5

输出样例1:

4 10

思路:map 存每一个数字的下标,并将下标从小到大排序,所以 map 里的 val 放优先队列即可

#include 
#include 
#include 

using namespace std;
const int N = 1e5 + 7;
int a[N], ans[N];
priority_queue, greater> q;
map, greater> > mp;

int main() {
    int n; cin >> n;
    for (int i = 0 ; i < n; ++i) {
        cin >> a[i];
        mp[a[i]].emplace(i);
	}
	
    for (int i = 0; i < n; ++i) {
        q.emplace(a[i]);
    }

    while (!q.empty()) {
        int x = q.top();
        q.pop();
        
        while (mp[x].size() > 1) {
            mp[x].pop();
            int id = mp[x].top();
            a[id] *= 2;
            if (!mp.count(a[id])) {
                q.emplace(a[id]);
            }
            mp[a[id]].emplace(id);
            mp[x].pop();
        }
        if (mp[x].size() == 1) {
            ans[mp[x].top()] = x;
        }
    }

    for (int i = 0; i < n; ++i) {
        if (ans[i]) {
            cout << ans[i] << " ";
        }
    }
    cout << endl;
}

 

你可能感兴趣的:(【STL运用】)