题意 : 给出一个序列,然后每次将重复出现的元素进行求和合并(若有多个,则优先取最小的进行合并),若某重复元素有很多,那么取最左边的那两个进行合并且合并后元素位于原来右边元素的位置,例如 3 2 6 2 2 这里 2 是重复元素,取最左边的两个 2 进行一次求和合并,合并后将变成 4 ,且这个 4 的位置位于较右边的 2 的位置,即序列变成 3 6 4 2。进行这样的操作,直到没有元素重复为止,输出最终序列。

分析 : 

考察模拟能力

首先注意到,输出最后的序列

只需要知道各个元素的相对位置即可

不必知道元素真正的位置下标是多少

即不用真正实时更新位置下标,因为这个操作会很麻烦

对于整个序列,需要知道哪些数是重复了的

这里用一个 set 维护

而对于每一个重复的数,又要知道其每个元素的位置

而且最好让这些位置升序排序,才方便取出最左边的两个进行合并

考虑此题的数据量并不是很大

所以考虑使用 map< int, set<int> > 来维护

最后就是模拟操作即可

所有的操作完成后答案就存在于 map 中

将元素信息取出来,然后丢到一个 vector 中

排序输出即可

  1. #pragma GCC optimize("O3")
  2. #define LL long long
  3. #define pi pair<long long, long long>
  4. #define MK(i, j) make_pair(i, j)
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7.  
  8. map<LL, set<LL> > mp;
  9. set<LL> s;
  10. vector<pi> ans;
  11.  
  12. int N;
  13. LL num;
  14.  
  15. int main(void)
  16. {
  17. ios_base::sync_with_stdio(); cin.tie();
  18. cin>>N;
  19.  
  20. ; i<N; i++){
  21. cin>>num;
  22. mp[num].insert(i);
  23. )
  24. s.insert(num);
  25. }
  26.  
  27. while(!s.empty()){
  28. set<LL>::iterator it = s.begin();
  29. mp[(*it)].erase(mp[(*it)].begin());
  30. mp[(*it)<<].insert((*mp[(*it)].begin()));
  31. mp[(*it)].erase(mp[(*it)].begin());
  32. ].size() > ) s.insert((*it)<<);
  33. ) s.erase((*it));
  34. }
  35.  
  36. for(map<LL, set<LL> >::iterator it=mp.begin(); it!=mp.end(); it++){
  37. ){
  38. ans.push_back(MK(*(*it).second.begin(), (*it).first));
  39. }
  40. }
  41.  
  42. sort(ans.begin(), ans.end());
  43.  
  44. cout<<ans.size()<<endl;
  45. for(vector<pi>::iterator it=ans.begin(); it!=ans.end(); it++)
  46. cout<<(*it).second<<" ";
  47. cout<<endl;
  48. ;
  49. }

Codeforces 962D Merge Equals ( 模拟 )的更多相关文章

  1. Codeforces 962D - Merge Equals

    链接: http://codeforces.com/problemset/problem/962/D 题意: 给出一个整数序列.选择其中最小且出现两次(或以上)的数,把最左边的两个从序列中移除,然后把 ...

  2. Educational Codeforces Round 42 (Rated for Div. 2) D. Merge Equals

    http://codeforces.com/contest/962/problem/D D. Merge Equals time limit per test 2 seconds memory lim ...

  3. Educational Codeforces Round 42D. Merge Equals(STL)

    D. Merge Equals time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. D Merge Equals Educational Codeforces Round 42 (Rated for Div. 2) (STL )

    D. Merge Equals time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...

  5. D. Merge Equals(from Educational Codeforces Round 42 (Rated for Div. 2))

    模拟题,运用强大的stl. #include <iostream> #include <map> #include <algorithm> #include < ...

  6. Educational Codeforces Round 42 D. Merge Equals (set + pll)

    CF962D 题意: 给定一个数列,对于靠近左端的两个相同大小的值x可以合并成一个点.把x 乘以2 放在第二个点的位置,问最后的数列大小和每个位子的值. 思路: 利用set 配上 pair 就行了,感 ...

  7. Codeforces 738D. Sea Battle 模拟

    D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...

  8. Codeforces 626A Robot Sequence(模拟)

    A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  9. CodeForces - 589D(暴力+模拟)

    题目链接:http://codeforces.com/problemset/problem/589/D 题目大意:给出n个人行走的开始时刻,开始时间和结束时间,求每个人分别能跟多少人相遇打招呼(每两人 ...

随机推荐

  1. netcore 实现一个简单的Grpc 服务端和客户端

    参考资料,和详细背景不做赘述. 首先定义prop 文件 syntax ="proto3"; package RouteGrpc; service HelloWorld{ rpc S ...

  2. 暴力破解-H3C路由器-MSR900

    作者:zptxwd@gmail.com  最后修改日期2017年5月10日    转载请保留出处 声明,本文仅用于技术交流和学习,不得用于任何商业用途及违法行为.   所暴力破解的设备信息 华三路由器 ...

  3. olap和Oltp(转)

    OLAP和OLTP的区别(基础知识) 联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则.OLAP的提出引起了很大的反响, ...

  4. mysql整理-常用sql语句

    一.常用sql show variables like 'character_set_client';#查询字符集 show databases;#列出所有的服务器上的数据库alter create ...

  5. python告诉你啥是佩奇

    被<啥是佩奇>这支广告片刷屏了. 佩奇明明是个喜剧角色, 但是看哭了所有人. <啥是佩奇>??? 效果图如下: # -*- coding:utf-8 -*- from turt ...

  6. ubuntu中安装Python3.7

    一. 源码安装: 1. 官网源码下载: Python官网:https://www.python.org/downloads/ setuptools官网:https://pypi.org/project ...

  7. 11、权重残差图、RLE和NUSE

    affyPLM包可以对芯片原始数据进行拟合回归,最后得到芯片权重(Weights)残差(Residuals)图.相对对数表达(RLE,Relative log expression)箱线图.相对标准差 ...

  8. Jade学习(三)之语法规则下

    jade可以自动识别单双标签 // 1.jade内容: input(type="button", value="点击") div // 此时输出❌error:i ...

  9. Linux中如何添加/删除FTP用户并设置权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被设置用户名为test.被限制路径为/home/test 2.创建建用户:在root用户下:   user ...

  10. c#HtmlAgilityPack解析html

    通过HtmlAgilityPack实现对html页面解析HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var itemLis ...