[ABC299G] Minimum Permutation
- 容易发现如果最终答案有两个相邻的数
满足 且 之后出现过,则显然可以找到另一个不劣的答案不满足这个性质 - 先说一个错误的结论:从前往后考虑,用链表维护答案,对于加入的一个数
,如果之前在 出现过,并且答案中这个的下一个数 则在链表中删除这个位置,并在插入在链表末尾 - 这个思路是错误的,Hack:
2 3 1 2 3
,因为 认为自己比 小,因此并不会替换到链表的末尾。 - 上面思路错误的原因是没有考虑到自这个数之后对答案的影响。但如果我们暴力考虑后面每一个数复杂度就变成了
- 既然让前面的往后考虑不行,那我们试着让后面的向前考虑。考虑单调栈(这里并不是狭义上求左右第一个最大值位置的单调栈,而是参照了单调栈的思路),对于加入的数
,如果这个数没在栈中出现过,则把栈顶所有不满足上述条件的弹出,并把 加入栈中,直到考虑完前 个,此时栈中显然有 个元素,便利输出答案即可 - 最终复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?