hihocoder 1356 分隔相同整数
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个包含
如果存在多个重排后的数组满足条件,输出字典序最小的数组。
这里字典序最小指:首先尽量使第一个整数最小,其次使第二个整数最小,以此类推。
输入
第一行包含一个整数
第二行包含
输出
输出字典序最小的重排数组。如果这样的数组不存在,输出 -1 。
样例输入
4
2 1 3 3
样例输出
1 3 2 3
这道题不算太水, 但是是个比较裸的数据结构题, 用 C++ STL 写很方便. 思路见之前的一篇博客——hihocoder #1327, 是这个题目的小数据版本. 改成大数据 (10W) 之后就需要数据结构来支持一些查询, 弄懂基本原理后, 需要支持哪些操作应该不难想出, 这里就不详谈了.
要求维护一个二元组
- 插入/删除/修改某个元素
- 查询
的最大值 - 查询
最大的二元组中 最小/次小的那个 - 查询
最小的二元组
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; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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