hihocoder 1356 分隔相同整数

 

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个包含 N 个整数的数组 A 。你的任务是将 A 重新排列,使得任意两个相等的整数在数组中都不相邻。  

如果存在多个重排后的数组满足条件,输出字典序最小的数组。  

这里字典序最小指:首先尽量使第一个整数最小,其次使第二个整数最小,以此类推。
输入

第一行包含一个整数 N ,表示数组的长度。(1N100000)  

第二行包含 N 个整数,依次是 A1,A2,AN。(1Ai1000000000)

输出

输出字典序最小的重排数组。如果这样的数组不存在,输出 -1 。
样例输入

    4  
    2 1 3 3

样例输出

    1 3 2 3


 

这道题不算太水, 但是是个比较裸的数据结构题, 用 C++ STL 写很方便. 思路见之前的一篇博客——hihocoder #1327, 是这个题目的小数据版本. 改成大数据 (10W) 之后就需要数据结构来支持一些查询, 弄懂基本原理后, 需要支持哪些操作应该不难想出, 这里就不详谈了.

要求维护一个二元组 (x,y) 的集合 (x,yN), 支持如下操作:

  • 插入/删除/修改某个元素 (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=0; i<n; cin>>x, cnt[x]++, i++);

    for(auto &x:cnt)
        s.insert({x.second, -x.first});

    if(s.begin()->first >(n-1)/2+1){puts("-1"); return 0;}

    for(int res, pre=0; n--; pre=res){
        int ma=s.begin()->first;
        if(ma>(n-1)/2+1){   //caution when n==0
            auto it=s.begin();
            if(it->second==pre) ++it;
            res=-it->second;
            if(it->first==1) cnt.erase(res);
            else{
                s.insert({it->first-1, 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==1) cnt.erase(it);
            else{
                it->second--;
                s.insert({it->second, -res});
            }
        }

        cout<<res<<' ';
    }
    cout<<endl;
}
复制代码

 

posted @   Pat  阅读(406)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· Ai满嘴顺口溜,想考研?浪费我几个小时
历史上的今天:
2015-08-07 Codeforces 567D One-Dimensional Battle Ships
点击右上角即可分享
微信分享提示