单调栈的平替算法
我好像发现了一个能代替单调栈功能的算法。 ~~我估计99%的可能性要么已经有别人发现了, 要么复杂度不对~~,但是毕竟一个蒟蒻第一次自己发明一个算法还是想分享一下的。
算法目的: 给定一个数组
题目:P5788, https://www.luogu.com.cn/problem/P5788
算法过程十分简单智障:
维护
正确性证明:
首先第一种情况显然,如果
时间复杂度证明:
由于每个
核心代码:
for(int i = n; i >= 1; i--){
if(a[i] < a[i + 1])l[i] = i + 1;
else{
int j = l[i + 1];
while(j != 0 && a[j] <= a[i]){
j = l[j];
}
l[i] = j;
}
}
for(int i = 1; i <= n; i++)cout<<l[i]<<" ";
我交到洛谷p5788单调栈模板题上过了,但是很有可能是因为我谷数据太仁慈。
附加功能:
同时这个算法似乎可以实现一个单调栈没有的功能:对每一个
算法过程和之前类似,只不过需要用到第一步算出来的
正确性和复杂度可以用相似的方法证明。
本蒟蒻第一次发博客文章,算法简陋且大概率完全错误望各大佬勿喷。