发现了一种O(n)的单调栈算法
  • 板块学术版
  • 楼主Nights_watcher
  • 当前回复9
  • 已保存回复9
  • 发布时间2025/1/21 09:07
  • 上次更新2025/1/21 11:32:11
查看原帖
发现了一种O(n)的单调栈算法
780034
Nights_watcher楼主2025/1/21 09:07

发现了一种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

求大佬证实/伪(洛谷题目单调栈模板已通过)

#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] << " ";
}
2025/1/21 09:07
加载中...