时间限制: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 分隔相同整数的更多相关文章

  1. hihocoder 1356 分隔相同整数 简单贪心

    分析:考虑贪心,考虑填ans[i],前i-1个合法,现在剩下一些数, 那么挑出出现次数最多的数,次数为mx,当前剩余总数为sum 如果sum-mx>=mx-1那么肯定有解,这个想想就知道了(这种 ...

  2. HihoCoder - 1478 水陆距离

    水陆距离 描述 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. 输入 第一行包含两个整数, ...

  3. 【HIHOCODER 1478】 水陆距离(BFS)

    描述 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. 输入 第一行包含两个整数,N和M. ...

  4. P1006 输出第二个整数

    题目描述 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数.把第二个输入的整数输出. 输入格式 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数. 输出格式 输出输入的三个整数 ...

  5. H - 遥远的糖果 HihoCoder - 1478

    给定一个N x M的01矩阵,其中1表示人,0表示糖.对于每一个位置,求出每个位置离糖的最短距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. Input 第一行包含两个整数,N和M. 以下 ...

  6. hihocoder1478 水陆距离

    地址:http://hihocoder.com/problemset/problem/1478 题目: 水陆距离 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个 ...

  7. iOS项目开发中的知识点与问题收集整理①(Part 一)

    前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在 ...

  8. SPFA

    SPFA算法用来求单源最短路.可以处理任何有解的情况. 先建一个数组\(dist_x = 起点到x的最短路长度\),当\(x=起点\)时为0,当x和起点不通时为INF(本题中为\(2^31-1\)). ...

  9. CFBundleVersion与CFBundleShortVersionString,上架注意事项

    CFBundleVersion,标识(发布或未发布)的内部版本号.这是一个单调增加的字符串,包括一个或多个时期分隔的整数. CFBundleShortVersionString  标识应用程序的发布版 ...

随机推荐

  1. 虾皮工作室QQ群列表

    各位博友: 本群不仅仅是提供好的资料,更重要是提供平台,提供解决问题的方法和思路.求人不如求己,掌握合理的方法和方式才是不断进步的根本.看我的文档,不单单是看内容,更应该从整理的方式和角度是深思,去想 ...

  2. Linux文件结构及基本文件夹

    虽然Linux系统有很多种类,但是对于文件系统分区这块,基本上各个版本的Linux系统都是一样的.Linux文件系统分区不像Windows那样将硬盘分为C.D.E.F盘这样,Linux的文件结构是单个 ...

  3. 矩阵求逆算法及程序实现(C++)

    在做课题时,遇到了求多项式问题,利用了求逆方法.矩阵求逆一般使用简单的算法,还有快速算法 如全选主元高斯-约旦消元法,但本文程序主要写了简单的矩阵求逆算法定义法之伴随矩阵求逆公式如下,其中A可逆: , ...

  4. matlab eps

    matlab eps eps是一个函数.当没有参数时默认参数是1.返回的是该参数的精度. 也就是说单个的eps实际上是eps(1),表示的是1的精度. 这里要说一下精度的概念.浮点数所能表示的数值范围 ...

  5. ios8调用相机报警告: Snapshotting a view that has not been rendered results in an empty snapshot. Ensure you(转)

    我这也报了这个警告,但按他的方法并没有起作用,把写到这个地方看是否其他人用的到 错误代码:Snapshotting a view that has not been rendered results ...

  6. 关于web前端的学习路线

    第一阶段: HTML+CSS:HTML进阶.CSS进阶.div+css布局.HTML+css整站开发. JavaScript基础:Js基础教程.js内置对象常用方法.常见DOM树操作大全.ECMAsc ...

  7. sqlite之聚合函数的使用

    聚合函数对一组值执行计算并返回单一的值.聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. ...

  8. 多词查询(Multi-word Queries)

    如果我们一次只能搜索一个词,那么全文搜索就会显得相当不灵活.幸运的是,通过match查询来实现多词查询也同样简单: GET /my_index/my_type/_search { "quer ...

  9. 【HDU 2089】不要62

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp,参照了打野的博客 预处理出f数组,f[i][j]表示第i位为数字j时的可行的数字总数. 对于区间 ...

  10. Java算法-插入排序

    插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的 ...