题意 : 给出一个序列,然后每次将重复出现的元素进行求和合并(若有多个,则优先取最小的进行合并),若某重复元素有很多,那么取最左边的那两个进行合并且合并后元素位于原来右边元素的位置,例如 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. java中变量的线程安全性

    静态变量:线程非安全.静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全.实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线 ...

  2. 一、Kubernetes_V1.10集群部署-master-生成证书

    一.证书生成 1.下载cfssl mkdir -p /etc/kubernetes/sslwget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget ...

  3. Qt两个类通过信号槽通信

    qt需要通过信号槽来通信,connect的时候总是返回false,请教了公司的一个小哥,才解决了问题,虽然是个很白痴的问题. bool b = QObject::connect(m_pCollectO ...

  4. 01Spring基于xml的IOC配置--入门

    01Spring基于xml的IOC配置 1.创建一个普通的maven工程 1.1 选择maven,不用骨架,点击下一步. 1.2 填写GroupId.ArtifactId.Version.填完点击下一 ...

  5. 在docker容器下利用数据卷实现在删除了mysql容器或者镜像的情况下恢复数据

    当把mysql容器销毁,在新建一个容器,进行之前的数据恢复. 因为之前建立了数据卷,那么现在就可以利用这个数据卷进行数据恢复. 使用docker volume create volume_name命令 ...

  6. 简单了解node stream

    Almost all Node.js applications, no matter how simple, use streams in some manner. 开篇先吓吓自己.画画图,分析分析代 ...

  7. Android多渠道打包且根据不同产品打包不同的assets资源目录

    因为项目中存在多种环境,既要区分bebug与release版本,release又要区分测试环境与生产上线环境,每次打包都得浪费不少的等待时间:并且哪个版本有问题还得去切换环境一个个打包,关键是还得牢记 ...

  8. JVM内存分配和垃圾回收以及性能调优

    JVM内存分配策略 一:堆中优先分配Eden 大多数情况下,对象都在新生代的Eden区中分配内存.而新生代会频繁进行垃圾回收. 二:大对象直接进入老年代 需要大量连续空间的对象,如:长字符串.数组等, ...

  9. ——HTTP状态码

    200 请求成功,请求所希望的响应头或数据体将随此返回 302 请求的资源现在临时从不同的URI响应请求,由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求. 304 如果客户端发送了一 ...

  10. 一、Signalr WebApi客服

    一.搭建环境 (redis服务) 链接测试 二.项目搭建 参考 1.搭建项目(直接项目-不包含MVC以及API) 项目结构 但是需要访问(所以还需要添加控制器Api的模式)选择Api 添加类库一个专门 ...