社区讨论

发现了一种O(n)的单调栈算法

学术版参与者 9已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@m65s255j
此快照首次捕获于
2025/01/21 09:09
去年
此快照最后确认于
2025/11/04 11:10
4 个月前
查看原帖
发现了一种O(n)O(n)的单调栈算法。
记录一个nextnext数组,表示右边第一个大于这个位置的数的位置,那么我们分两种情况讨论:
1.ai+1>ai,nexti=i+12.ai+1<ai,则记录变量j=i+1一直跳j=nextj直到aj>ai,nexti=j1.a_{i+1}>a_i,next_i=i+1\\ 2.a_{i+1}<a_i,则记录变量j=i+1一直跳j=next_{j}直到a_j>a_i,next_i=j
求大佬证实/伪(洛谷题目单调栈模板已通过)
CPP
#include <bits/stdc++.h>
using namespace std;
long long last[3000005] , a[3000005];
int main ()
{
    ios :: sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);
	int n;
	cin >> n;
    for (int i = 1;i <= n;i ++) cin >> a[i];
    for (int i = n - 1;i >= 1;i --)
        if (a[i] < a[i + 1]) last[i] = i + 1;
        else
        {
            int j = last[i + 1];
            while (j && a[j] < a[i]) j = last[j];
            last[i] = j;
        }
    for (int i = 1;i <= n;i ++) cout << last[i] << " ";
}

回复

9 条回复,欢迎继续交流。

正在加载回复...