CF1886C Decreasing String 题解

Problem - C - Codeforces

Decreasing String - 洛谷

  • p.s. 本题提到的所有 sii 均表示 s 字符串的下标,而不是第 i 个字符串。因为我懒不想改了

  • 每次遇到这种题都想不到最好的解决方法,我是不是应该把所有比赛的 C 都做一遍啊

  • 容易想到 O(n2) 的判断方法,枚举每个位置,找到满足 si>si+1 最左边的位置然后删掉。如果没有删最后一个

  • 我们考虑能不能不要每次都扫一遍,而是看一下两次扫描有什么联系。

  • 我们发现如果每次删除后不重新标号,那每次选择的 i 是递增的,因为不递增一定不优,这个很显然。

  • 我们在扫描到 si 时,所有可以删去的 j,都满足:

    • sj 未被删去

    • sj>si

  • 而且我们可以发现一个性质:如果 sj>sisj 不能被删除,则说明 (j,i) 中间隔着一个 sk>si,则 sj 一定会在 sk 处删除。

  • 因此我们可以使用单调栈维护每一时刻扫描到 i 时扫过的这些数中 s 的状态,每次删去一个数后让 ppn,nn1 即可

  • 最终复杂度 O(n)

posted @   FOX_konata  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示