hihocoder 1356 分隔相同整数
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个包含 $N$ 个整数的数组 $A$ 。你的任务是将 $A$ 重新排列,使得任意两个相等的整数在数组中都不相邻。
如果存在多个重排后的数组满足条件,输出字典序最小的数组。
这里字典序最小指:首先尽量使第一个整数最小,其次使第二个整数最小,以此类推。
输入
第一行包含一个整数 $N$ ,表示数组的长度。($1 \le N \le 100000$)
第二行包含 $N$ 个整数,依次是 $A_1, A_2, \dots A_N$。($1 \le A_i \le 1000000000$)
输出
输出字典序最小的重排数组。如果这样的数组不存在,输出 -1 。
样例输入
4
2 1 3 3
样例输出
1 3 2 3
这道题不算太水, 但是是个比较裸的数据结构题, 用 C++ STL 写很方便. 思路见之前的一篇博客——hihocoder #1327, 是这个题目的小数据版本. 改成大数据 (10W) 之后就需要数据结构来支持一些查询, 弄懂基本原理后, 需要支持哪些操作应该不难想出, 这里就不详谈了.
要求维护一个二元组 $(x,y)$ 的集合 $(x, y \in \mathbb{N}^*)$, 支持如下操作:
- 插入/删除/修改某个元素 $(x,y)$
- 查询 $x$ 的最大值
- 查询 $y$ 最大的二元组中 $x$ 最小/次小的那个
- 查询 $x$ 最小的二元组
Implementation
#include <bits/stdc++.h>
using namespace std; map<int,int> cnt;
typedef pair<int,int> P;
set<P, greater<P>> s; int main(){
int n; cin>>n;
for(int x, i=; i<n; cin>>x, cnt[x]++, i++); for(auto &x:cnt)
s.insert({x.second, -x.first}); if(s.begin()->first >(n-)/+){puts("-1"); return ;} for(int res, pre=; n--; pre=res){
int ma=s.begin()->first;
if(ma>(n-)/+){ //caution when n==0
auto it=s.begin();
if(it->second==pre) ++it;
res=-it->second;
if(it->first==) cnt.erase(res);
else{
s.insert({it->first-, it->second});
cnt[res]--;
}
s.erase(it);
} else{
auto it=cnt.begin();
if(it->first==pre) ++it;
res=it->first;
s.erase({it->second, -res});
if(it->second==) cnt.erase(it);
else{
it->second--;
s.insert({it->second, -res});
}
} cout<<res<<' ';
}
cout<<endl;
}
hihocoder 1356 分隔相同整数的更多相关文章
- hihocoder 1356 分隔相同整数 简单贪心
分析:考虑贪心,考虑填ans[i],前i-1个合法,现在剩下一些数, 那么挑出出现次数最多的数,次数为mx,当前剩余总数为sum 如果sum-mx>=mx-1那么肯定有解,这个想想就知道了(这种 ...
- HihoCoder - 1478 水陆距离
水陆距离 描述 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. 输入 第一行包含两个整数, ...
- 【HIHOCODER 1478】 水陆距离(BFS)
描述 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. 输入 第一行包含两个整数,N和M. ...
- P1006 输出第二个整数
题目描述 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数.把第二个输入的整数输出. 输入格式 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数. 输出格式 输出输入的三个整数 ...
- H - 遥远的糖果 HihoCoder - 1478
给定一个N x M的01矩阵,其中1表示人,0表示糖.对于每一个位置,求出每个位置离糖的最短距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. Input 第一行包含两个整数,N和M. 以下 ...
- hihocoder1478 水陆距离
地址:http://hihocoder.com/problemset/problem/1478 题目: 水陆距离 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个 ...
- iOS项目开发中的知识点与问题收集整理①(Part 一)
前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在 ...
- SPFA
SPFA算法用来求单源最短路.可以处理任何有解的情况. 先建一个数组\(dist_x = 起点到x的最短路长度\),当\(x=起点\)时为0,当x和起点不通时为INF(本题中为\(2^31-1\)). ...
- CFBundleVersion与CFBundleShortVersionString,上架注意事项
CFBundleVersion,标识(发布或未发布)的内部版本号.这是一个单调增加的字符串,包括一个或多个时期分隔的整数. CFBundleShortVersionString 标识应用程序的发布版 ...
随机推荐
- 如何在前台脚本通过json传递数据到后台(使用微软自带的ajax)
首先,我们要在前台引入json的脚本,以便于把js对象序列化 <script type="text/javascript" src="/js/jquery.json ...
- ASP.NET 小白从零开始建站简易教程 (一)域名、虚拟主机、FTP上传文件
只考虑性价比,纯新手实验无备案.跟着步骤走半小时即可收获独立的个人网站一枚! 我的实验站 http://www.bearlab.site/ ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 目前总价花费86元(域名加虚 ...
- Nodejs进阶:基于express+multer的文件上传
关于作者 程序猿小卡,前腾讯IMWEB团队成员,阿里云栖社区专家博主.欢迎加入 Express前端交流群(197339705). 正在填坑:<Nodejs学习笔记> / <Expre ...
- js正则表单验证汇总,邮箱验证,日期验证,电话号码验证,url验证,信用卡验证,qq验证
本文主要汇总各种正则验证,很多都是转载,本人也会尽可能验证准确性,如有错误欢迎留言 //trim()方法在有些浏览器中不兼容,最好自己重写一下 String.prototype.trim=functi ...
- 东大OJ-1588: Routing Table
题目描述 In the computer network, a Router is a device which finds an optimal way to transmit the datagr ...
- 74 partprobe-磁盘管理
partprobe命令用于重读分区表,当出现删除文件后,出现仍然占用空间.可以partprobe在不重启的情况下重读分区. 语法 partprobe (选项) (参数) 选项 -d:不更新内核: -s ...
- PHP include语句和require语句
<?php /* PHP include语句和require语句 include和require 语句是相同的 除了错误处理方面: *require 会生成致命错误,并停止脚本 *include ...
- 从 MySQL+MMM 到 MariaDB+Galera Cluster : 一个高可用性系统改造
很少有事情比推出高可用性(HA)系统之后便经常看到的系统崩溃更糟糕.对于我们这个Rails运行机的团队来说,这个失效的HA系统是MySQL多主复制管理器(MMM). 我们已经找寻MMM的替代品有一段时 ...
- Java 构建器
假如我们的一个实体类有很多的属性值,但是这些属性值又是可选的.如果我们遇到这样的是类,如何设计出方便的实体类呢? 通常解决办法一: 重叠构造器 public class User { private ...
- SQL复习
1.select SELECT LastName,FirstName FROM Persons SELECT * FROM Persons 2.distinct SELECT DISTINCT Com ...