zoukankan      html  css  js  c++  java
  • codeforces 962D Merge Equals

    思路:两个相等的数相加得到的数一定是没有经过处理的,所以记录每个数出现的下标,然后从小到大枚举,处理每个数就可以。

    关键是用stl来组织数据。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<map>
    #include<queue>
    #include<functional>
    #define DEBUG(x) cout<<#x<<" = "<<x<<endl
    typedef long long ll;
    using namespace std;
    map<ll,priority_queue<int,vector<int>,greater<int> > >mp;
    map<ll,priority_queue<int,vector<int>,greater<int> > >::iterator itr;
    vector<pair<int,ll> >v;
    bool cmp(const pair<int,ll> &pa,const pair<int,ll> &pb)
    {
        return pa.first<pb.first;
    }
    int main()
    {
    //    freopen("in.txt","r",stdin);
        int n;
        scanf("%d",&n);
        for(int i=0;i<n ;i++ ){
            ll t;
            scanf("%I64d",&t);
            mp[t].push(i);
        }
        for(itr=mp.begin();itr!=mp.end() ;itr++ ){
            ll t=itr->first;
            auto &pq=itr->second;
            ///合并两个相等的数,直到数量小于2
            while(pq.size()>=2){
                int i1=pq.top();
                pq.pop();
                int i2=pq.top();
                pq.pop();
                i1=max(i1,i2);
                mp[2*t].push(i1);
            }
        }
        for(auto p:mp){
            auto &pq=p.second;
            ll t=p.first;
            if(pq.size()==1)v.push_back(make_pair(pq.top(),t));
        }
        sort(v.begin(),v.end(),cmp);
        printf("%d
    ",v.size());
        for(int i=0;i<v.size() ;i++ ){
            printf("%d ",v[i].second);
        }
    }
  • 相关阅读:
    Oracle 10g AND Oracle 11g手工建库案例--Oracle 11g
    第十七篇:实例分析(1)--初探WDDM驱动学习笔记(八)
    Git权威指南学习笔记(二)Git暂存区
    C++11多线程教学II
    c++ 11 多线程教学(1)
    C++11 多线程 基础
    C++11下的线程池以及灵活的functional + bind + lamda
    intel线程库tbb的使用
    TBB入门
    TTB 基本
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9749812.html
Copyright © 2011-2022 走看看