题意:找到最大的点 P P P,使得两个数组 a a a 和 b b b 在区间 [ 1 , P ] [1,P] [1,P]的任意子区间中的最小值下标相同
题解:对两个数组分别维护单调递增的单调队列。 每次插入后判断队列中的元素个数是否相同,不相同直接返回答案。
这样做保证了两个数组对应区间单调性相同,子区间个数也相同。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int a[maxn],b[maxn],n,q1[maxn],q2[maxn];
int solve(){
int f1 = 0, r1 = 0;
int f2 = 0, r2 = 0;
int ans;
for(int i = 1; i <= n; i++){
while(f1 < r1 && a[i] <= a[q1[r1-1]]) r1--;
q1[r1++] = i;
while(f2 < r2 && b[i] <= b[q2[r2-1]]) r2--;
q2[r2++] = i;
if(r1-f1 != r2-f2) return i-1;
ans = i;
}
return ans;
}
int main(){
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]);
}
printf("%d\n",solve());
}
}