Codeforces 962D Merge Equals ( 模拟 )
题意 : 给出一个序列,然后每次将重复出现的元素进行求和合并(若有多个,则优先取最小的进行合并),若某重复元素有很多,那么取最左边的那两个进行合并且合并后元素位于原来右边元素的位置,例如 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 ( 模拟 )的更多相关文章
- Codeforces 962D - Merge Equals
链接: http://codeforces.com/problemset/problem/962/D 题意: 给出一个整数序列.选择其中最小且出现两次(或以上)的数,把最左边的两个从序列中移除,然后把 ...
- 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 ...
- 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 ...
- 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 ...
- D. Merge Equals(from Educational Codeforces Round 42 (Rated for Div. 2))
模拟题,运用强大的stl. #include <iostream> #include <map> #include <algorithm> #include < ...
- Educational Codeforces Round 42 D. Merge Equals (set + pll)
CF962D 题意: 给定一个数列,对于靠近左端的两个相同大小的值x可以合并成一个点.把x 乘以2 放在第二个点的位置,问最后的数列大小和每个位子的值. 思路: 利用set 配上 pair 就行了,感 ...
- Codeforces 738D. Sea Battle 模拟
D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...
- Codeforces 626A Robot Sequence(模拟)
A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- CodeForces - 589D(暴力+模拟)
题目链接:http://codeforces.com/problemset/problem/589/D 题目大意:给出n个人行走的开始时刻,开始时间和结束时间,求每个人分别能跟多少人相遇打招呼(每两人 ...
随机推荐
- mysql——单表查询——分组查询——示例
一.基本查询语句 select的基本语法格式如下: select 属性列表 from 表名和视图列表 [ where 条件表达式1 ] [ group by 属性名1 [ having 条件表达式2 ...
- C语言博课作业11
一.本周作业头 这个作业属与那个课程 C语言程序设计I 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/10130 ...
- [Python3] 030 常用模块 os
目录 os 1. os.getcwd() 2. os.chdir() 3. os.listdir() 4. os.makedir() 5. os.system() 6. os.getenv() 7. ...
- idea运行时 Process finished with exit code -1073741819 (0xC0000005)
问题描述: idea中启动项目报 Process finished with exit code -1073741819 (0xC0000005) ,如图所示: 问题解决: ...
- MyBatis一级缓存的笔记及记录
精髓内容来源于<图灵学院> 一.概述: 一级缓存是MyBatis天然自带的,是默认开启且没有关闭的地方,1级缓存只能作用于查询回话中,所以也叫会话缓存: 这里举个例子: 订单表存在一对多的 ...
- 元素定位--firebug安装
1.火狐浏览器调试工具firebug插件的安装 打开浏览器---添加组件---搜索firebug
- 03、重定义CDF
有一篇文章“Evolving gene/transcript definitions significantly alter the interpretation of GeneChip data”, ...
- RabbitMQ入门教程(六):路由选择Routing
原文:RabbitMQ入门教程(六):路由选择Routing 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...
- scrapy存储mysql
scrapy 数据存储mysql #spider.pyfrom scrapy.linkextractors import LinkExtractor from scrapy.spiders imp ...
- Python 常用库(随时补充)
1. Python-RSA使用手册 英文文档见Python-RSA使用手册,主要介绍了Python-RSA的消息的加密解密.文件的加密解密以及签名的方法. Installation 使用pip ins ...