时间限制: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. vbs mytest

    public Function SaveText(filePath,content)set fso=createobject("scripting.filesystemobject" ...

  2. JavaScript的一些知识碎片(1)

    打算把使用Javascript的水平从child提升到小学毕业,近期会持续记录一些知识点. javascript的引用机制:只要一个对象赋值为另一个对象,就建立了引用.一旦建立了引用,对象们就公用一块 ...

  3. 重拾Blog

    上个月是我入职现在的公司三周年的月份,所以又续订了五年的合同,最近有一些思考,也不知道这个五年能否还会一直在这个公司工作. 一切随缘吧. 闲适有毒,忙碌的时光总是过的很快,自从加入这个公司以来,日常的 ...

  4. SDRAM操作原理分析

    芯片原理图 引脚原理图 指令 通过对上面指令的总结,简化出要用到的指令如下: 指令 常量名 CKE CSn RAS CASn WEn 备注 空操作 NOP 1 0 1 1 1   行激活 ACTIVE ...

  5. java 环境配置

    ​'JAVAC' 不是内部或外部命令解决方法 'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 'JAVA' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法相似. ...

  6. 利用ZTree链接数据库实现 [权限管理]

    最近想研究权限管理,看群里有人发了ZTrees模板,我看了下,觉得笔easyUI操作起来更灵活些,于是就开始研究了. 刚开始从网上找了找了个Demo,当然这个并没有实现权限啥的,但实现了前台调用Aja ...

  7. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  8. Win7宽带一键创建

    简化创建宽带连接步骤,为简便而生. 不断分享,不断进步. 免费下载:                  http://yunpan.cn/cmZesi2jpJk9E  访问密码 9444

  9. 在Ubuntu 14.04安装Nginx

    ###介绍 Nginx是世界上最流行的网络服务器中的一种,负责托管网络上一些流量最高的网站.在多数情况下,Nginx比Apache在资源上更加友好,可以作为网络服务器或反向代理服务器. 这篇教程中,我 ...

  10. iOS开发--二维码的生成

    一.需要包含头文件 #import <CoreImage/CoreImage.h> 二.示例代码 -- 以下生成的二维码不够清晰 如图: - (void)touchesBegan:(NSS ...