codeforces 962D Merge Equals
Posted malcolmmeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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); } }
以上是关于codeforces 962D Merge Equals的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 42 D. Merge Equals (set + pll)
Preparing for Merge Sort CodeForces - 847B