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

分析 : 

考察模拟能力

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

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

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

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

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

这里用一个 set 维护

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

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

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

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

最后就是模拟操作即可

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

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

排序输出即可

#pragma GCC optimize("O3")
#define LL long long
#define pi pair<long long, long long>
#define MK(i, j) make_pair(i, j)
#include <bits/stdc++.h>
using namespace std;

map<LL, set<LL> > mp;
set<LL> s;
vector<pi> ans;

int N;
LL num;

int main(void)
{
    ios_base::sync_with_stdio(); cin.tie();
    cin>>N;

    ; i<N; i++){
        cin>>num;
        mp[num].insert(i);
        )
            s.insert(num);
    }

    while(!s.empty()){
        set<LL>::iterator it = s.begin();
        mp[(*it)].erase(mp[(*it)].begin());
        mp[(*it)<<].insert((*mp[(*it)].begin()));
        mp[(*it)].erase(mp[(*it)].begin());
        ].size() > ) s.insert((*it)<<);
        ) s.erase((*it));
    }

    for(map<LL, set<LL> >::iterator it=mp.begin(); it!=mp.end(); it++){
        ){
            ans.push_back(MK(*(*it).second.begin(), (*it).first));
        }
    }

    sort(ans.begin(), ans.end());

    cout<<ans.size()<<endl;
    for(vector<pi>::iterator it=ans.begin(); it!=ans.end(); it++)
        cout<<(*it).second<<" ";
    cout<<endl;
    ;
}

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. js多张图片合成一张图,canvas(海报图,将二维码和背景图合并) -----vue

    思路:vue中图片合并 首先准备好要合并的背景图,和请求后得到的二维码, canvas画图,将两张背景图和一张二维码用canvas画出来, 将canvas再转为img 注意canvas和图片的清晰图和 ...

  2. Maven使用基础

    (转)https://my.oschina.net/xiaomaoandhong/blog/104045 基于 约定优于配置(Convention Over Configuration)的原则,无特殊 ...

  3. Akka系列(五):Java和Scala中的Future

    前言....... 随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue ...

  4. Linux环境下Oracle安装参数设置

    前面讲了虚拟机的设置和OracleLinux的安装,接下来我们来说下Oracle安装前的准备工作.1.系统信息查看系统信息查看首先服务器ip:192.168.8.120服务器系统:Oracle Lin ...

  5. mac 简洁安装Kafka

    Mac 简洁安装Kafka 1.采用homebrew的方式 终端执行命令:brew install kafka 2.修改Kafka服务配置文件server.properties 执行命令: vi /u ...

  6. C++继承中的同名覆盖

    1,父子间的冲突是由继承带来的,两个类之间存在了继承的关系,必然的会带来一 些问题,本文要讨论的是父子之间成员变量或成员函数的命名问题: 2,思考: 1,子类中是否可以定义父类中的同名成员? 1,可以 ...

  7. requests实现文件下载, 期间显示文件信息&下载进度_python3

    requests实现文件下载, 期间显示文件信息&下载进度 """使用模块线程方式实现网络资源的下载 # 实现文件下载, 期间显示文件信息&下载进度 # ...

  8. 实用且堪称神器的Chrome插件推荐(转)

    出处: http://tengj.top/2018/02/17/ggcj/ 前言 相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大 ...

  9. 自己动手实现一个html2canvas

    前言 昨天写了新手引导动画的4种实现方式,里面用到了 html2canvas 于是就顺便了解了一下实现思路. 大概就是 利用 svg 的 foreignObject 标签, 嵌入 dom, 最后再利用 ...

  10. 将数据库模型放入到.Net Core的类库中

    一.前提概要 今年某天突然无聊,就决定学习.net core,此时的版本已经是.net core 1.1了.之前一直是用.net framework做项目,一直对Html.EditFor()等Html ...