【题解】
题意:要求对于给定的长度为n的数组a,b,找到最大的p(p<=n)使得取出的子数组a1,a2,...ap与b1,b2,...ap,满足对于任意1<=l<=r<=p的(l,r)对都存在一个相同的最小值的下标。
思路:单调栈处理出数组a,b的每个元素作为最小值的区间最左端点,若ai左端点=bi左端点,则更新答案,否则结束查询。时间复杂度O(n)。
【代码】
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
int a[maxn],b[maxn];
int l1[maxn],l2[maxn];
int main()
{
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
stack <int> s;
for(int i=1;i<=n;i++)
{
while(!s.empty()&&a[s.top()]>=a[i])
s.pop();
if(s.empty())l1[i]=1;
else l1[i]=s.top()+1;
s.push(i);
}
while(!s.empty()) s.pop();
for(int i=1;i<=n;i++)
{
while(!s.empty()&&b[s.top()]>=b[i])
s.pop();
if(s.empty())l2[i]=1;
else l2[i]=s.top()+1;
s.push(i);
}
int ans=1;
for(int i=2;i<=n;i++)
if(l1[i]==l2[i])
ans++;
else break;
printf("%d\n",ans);
}
return 0;
}