const int N = 2e5 + 10;
int n;
LL a[N];
LL stk[N],top;
LL L[N],R[N];
void solve()
{
cin >> n;
for (int i = 1;i <= n;i ++) cin >> a[i];
//第一行输出每个数字其左边第一个比其大的数字,不存在则输出 -1。
for (int i = 1;i <= n;i ++)
{
while(top && a[stk[top]] <= a[i]) top--;
if (top) L[i] = stk[top];
else L[i] = -1;
stk[++top] = i;
}
for (int i = 1;i <= n;i ++) cout << (L[i] == -1 ? -1: a[L[i]]) << " "; cout << endl;
top = 0;
//第二行输出每个数字其右边第一个比其大的数字,不存在则输出 -1。
for (int i = n;i >= 1;i --)
{
while(top && a[stk[top]] <= a[i]) top--;
if (top) R[i] = stk[top];
else R[i] = -1;
stk[++top] = i;
}
for (int i = 1;i <= n;i ++) cout << (R[i] == -1 ? -1: a[R[i]]) << " "; cout << endl;
top = 0;
//第三行输出每个数字其左边第一个比其小的数字,不存在则输出 -1。
for (int i = 1;i <= n;i ++)
{
while(top && a[stk[top]] >= a[i]) top --;
if (top) L[i] = stk[top];
else L[i] = -1;
stk[++top] = i;
}
for (int i = 1;i <= n;i ++) cout << (L[i] == -1 ? -1: a[L[i]]) << " "; cout << endl;
top = 0;
//第四行输出每个数字其右边第一个比其小的数字,不存在则输出 -1。
for (int i = n;i >= 1;i --)
{
while(top && a[stk[top]] >= a[i]) top --;
if (top) R[i] = stk[top];
else R[i] = -1;
stk[++top] = i;
}
for (int i = 1;i <= n;i ++) cout << (R[i] == -1 ? -1: a[R[i]]) << " "; cout << endl;
}
单调栈模板
最新推荐文章于 2025-05-31 19:23:21 发布