#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两栈的元素个数不相等时,则已达到最大
我的是用数组模拟栈