题意 : 给出一个序列,然后每次将重复出现的元素进行求和合并(若有多个,则优先取最小的进行合并),若某重复元素有很多,那么取最左边的那两个进行合并且合并后元素位于原来右边元素的位置,例如 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. 【神经网络与深度学习】Caffe训练执行时爆出的Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type

    自己建立一个工程,希望调用libcaffe.lib ,各种配置好,也能成功编译,但是运行就会遇到报错 F0519 14:54:12.494139 14504 layer_factory.hpp:77] ...

  2. mysql——单表查询——其它整理示例00

    ), sname ), sage ), ssex ) ); ','zhaolei','1990-01-01','nan'); ','qiandian','1990-12-21','nan'); ',' ...

  3. Maven使用基础

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

  4. [ASP.NET] 数据绑定以及Container.DataItem的具体分析 [转]

    灵活的运用数据绑定操作        绑定到简单属性:<%#UserName%>        绑定到集合:<asp:ListBox id="ListBox1" ...

  5. Linux 命令 watch 监测命令的运行结果

    watch 命令周期性地执行命令,全屏显示输出命令.watch命令可以监测一个命令的运行结果 命令参数 -n, --interval 设置间隔时间.默认情况下,watch 每隔 2 秒执行一次命令. ...

  6. hdfs的balancer

    参考: https://blog.csdn.net/mnasd/article/details/80369603 在CDH中选一个资源多的节点,安装 HDFS->添加角色到实例 启动后状态是灰的 ...

  7. P1880石子合并

    1995年的noi区间dp题,这道题AC耗时达到了数月. 有一道题叫做果子合并,也是求合并的最小花费,但是那个题是可以随便合并两堆,但是这个题只能合并相邻的两堆,并且是一个环.对于环的问题,我们一般可 ...

  8. 不要64 数位DP

    Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...

  9. Ubantu问题记录

    2019.4.21Ubantu问题:常用命令:sudo是一种权限管理机制,依赖于/etc/sudoers,定义了授权给哪个用户可以以管理员的身份执行管理命令格式:sudo -u USERNAME CO ...

  10. ArcGis执行StartEditing(true)时,winform程序直接崩溃.

    问题描述:在Program中配置了ArcGis的许可,又在winform窗体添加了许可,导致执行StartEditing(true)时,winform程序直接崩溃. 原代码如下: static cla ...