CF1827B2 Range Sorting (Hard Version)

原题

翻译

首先,很典的,对于一个区间[l,r],他的最少操作次数为:

rl+1i=lr1[maxj=liaj<minj=i+1raj]

正难则反,我们考虑先算出l=1n1r=l+1n(rl+1),再拿后面那一部分减去前面那一部分

然后就到了经典的交换求和顺序的环节

我们枚举maxj=liaj的最大值对应的位置,记作b,在b左边找到距离最近的a满足aa>ab(这里ai数组和a变量注意区分),在b右边找到距离最近的c满足ac>ab,在c右边找到距离最近的d满足ad<ab,则左端点的范围为(a,b],右端点的范围为[c,d),最终答案为(ba)×(dc)

我们考虑怎么找到a,c,d。我们可以把他们排序后从小到大删数,把<b的和>b的放到两个set里,每次二分即可,这么做是O(nlogn)

不过还有O(n)的做法,我们发现a,c的单调栈都很好维护,最不好维护的是d的单调栈,因为我们要保证他在c的右边。然后这里就要用到一个小技巧:单调栈套单调栈

听起来好像很吓人,那其实只是在维护c的时候,如果c栈里的元素被弹了出来,我们再把弹出来的元素放到d栈中去,这样就可以保证d栈的元素一定在c栈之后啦(理论可行)

这样最终复杂度O(n)

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