原题
翻译
首先,很典的,对于一个区间[l,r],他的最少操作次数为:
正难则反,我们考虑先算出∑l=1n−1∑r=l+1n(r−l+1),再拿后面那一部分减去前面那一部分
然后就到了经典的交换求和顺序的环节
我们枚举maxj=liaj的最大值对应的位置,记作b,在b左边找到距离最近的a满足aa>ab(这里ai数组和a变量注意区分),在b右边找到距离最近的c满足ac>ab,在c右边找到距离最近的d满足ad<ab,则左端点的范围为(a,b],右端点的范围为[c,d),最终答案为(b−a)×(d−c)
我们考虑怎么找到a,c,d。我们可以把他们排序后从小到大删数,把<b的和>b的放到两个set里,每次二分即可,这么做是O(nlogn)的
不过还有O(n)的做法,我们发现a,c的单调栈都很好维护,最不好维护的是d的单调栈,因为我们要保证他在c的右边。然后这里就要用到一个小技巧:单调栈套单调栈
听起来好像很吓人,那其实只是在维护c的时候,如果c栈里的元素被弹了出来,我们再把弹出来的元素放到d栈中去,这样就可以保证d栈的元素一定在c栈之后啦(理论可行)
这样最终复杂度O(n)
哦懂了懂了,等比数列求和。
(3) 到 (4) 是怎么转移的,大佬orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?