Equivalent Prefixes

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[600005],b[600005],a1[600005],b1[600005];
int main()
{
    int i,j,m,n,s,w,k,k1,ma;
    while(~scanf("%d",&n))
    {
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(i=0; i<n; i++)
            scanf("%d",&b[i]);
        k=k1=0;
        ma=n;
        for(i=0; i<n; i++)
        {
            while(k>0&&a[i]<a1[k-1])
                k--;
            while(k1>0&&b[i]<b1[k1-1])
                k1--;
            a1[k++]=a[i];
            b1[k1++]=b[i];
            if(k!=k1)
            {
                ma=i;
                break;
            }
        }
        printf("%d
",ma);
    }
    return 0;
}

题意: 求一个最大p使得,在区间[1, p] 内的所有区间 a 序列 和 b序列的最小值下标相同

用单调栈来维护,当第i个元素要进栈时,进行必要出栈操作,使得第i个元素进栈后,该栈单调递增,当a,b两栈的元素个数不相等时,则已达到最大

我的是用数组模拟栈

原文地址:https://www.cnblogs.com/zcb123456789/p/11279675.html