使用哈希表、最大堆和冷却队列实现贪心算法。
题目要求任意长度不超过 w 的相邻片段内编号互不相同,等价于:相同编号的两次出现位置之差至少为 w。
具体步骤:
调度台收到长度为 m 的任务编号序列 v1,v2,…,vm,以及正整数窗宽 w。需要把该序列重排成新序列 s。
要求:在 s 中,任意一截长度至多为 w 的相邻非空片段里,任务编号两两不同。
若存在多种合法重排,输出其中任意一种;若无法做到,输出 -1。
【说明】相邻片段即下标连续的一段;允许覆盖整条序列,也允许只覆盖其中若干位。
第一行一个正整数 m(1≤m≤2×105),表示序列长度。
第二行一个正整数 w(1≤w≤m),表示窗宽上界。
第三行 m 个整数 v1,v2,…,vm(1≤vi≤109),表示原始任务编号。
若存在合法重排,输出一行 m 个整数,表示序列 s(必须由 v 重排得到)。
否则输出一行一个整数 -1。
多解时输出任意合法解即可;在线评测会自动判定正确性。本地自测若遇多解,请自行核对是否满足窗内互异。
输入
6
3
2 2 1 3 4 5
输出
2 1 3 2 4 5
说明
两个相同的 2 被放在间距不小于 3 的下标上,任意长度 ≤3 的相邻片段里编号均互异。
输入
6
3
2 2 2 1 3 4
输出
-1
说明
值为 2 的编号出现了 3 次,在长度为 6、窗宽为 3 时无法把它们两两隔开,故无解。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册