[ABC299G] Minimum Permutation

ABC229G洛谷链接
atcoder链接

  • 容易发现如果最终答案有两个相邻的数 bi,bi+1 满足 bi>bi+1bi 之后出现过,则显然可以找到另一个不劣的答案不满足这个性质
  • 先说一个错误的结论:从前往后考虑,用链表维护答案,对于加入的一个数 ai ,如果之前在 aj 出现过,并且答案中这个的下一个数 <aj 则在链表中删除这个位置,并在插入在链表末尾
  • 这个思路是错误的,Hack: 2 3 1 2 3 ,因为 2 认为自己比 3 小,因此并不会替换到链表的末尾。
  • 上面思路错误的原因是没有考虑到自这个数之后对答案的影响。但如果我们暴力考虑后面每一个数复杂度就变成了 O(n2)
  • 既然让前面的往后考虑不行,那我们试着让后面的向前考虑。考虑单调栈(这里并不是狭义上求左右第一个最大值位置的单调栈,而是参照了单调栈的思路),对于加入的数 ai ,如果这个数没在栈中出现过,则把栈顶所有不满足上述条件的弹出,并把 ai 加入栈中,直到考虑完前 n 个,此时栈中显然有 m 个元素,便利输出答案即可
  • 最终复杂度 O(n)
posted @   FOX_konata  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示