链接:https://ac.nowcoder.com/acm/contest/881/A
来源:牛客网
Two arrays u and v each with m distinct elements are called equivalent if and only if RMQ(u,l,r)=RMQ(v,l,r)RMQ(u,l,r)=RMQ(v,l,r) for all 1≤l≤r≤m1≤l≤r≤m
where RMQ(w,l,r)RMQ(w,l,r) denotes the index of the minimum element among wl,wl+1,…,wrwl,wl+1,…,wr.
Since the array contains distinct elements, the definition of minimum is unambiguous.
Bobo has two arrays a and b each with n distinct elements. Find the maximum number p≤np≤n where {a1,a2,…,ap}{a1,a2,…,ap} and {b1,b2,…,bp}{b1,b2,…,bp} are equivalent.
The input consists of several test cases and is terminated by end-of-file. The first line of each test case contains an integer n. The second line contains n integers a1,a2,…,ana1,a2,…,an. The third line contains n integers b1,b2,…,bnb1,b2,…,bn. * 1≤n≤1051≤n≤105 * 1≤ai,bi≤n1≤ai,bi≤n * {a1,a2,…,an}{a1,a2,…,an} are distinct. * {b1,b2,…,bn}{b1,b2,…,bn} are distinct. * The sum of n does not exceed 5×1055×105.
For each test case, print an integer which denotes the result.
示例1
复制
2 1 2 2 1 3 2 1 3 3 1 2 5 3 1 5 2 4 5 2 4 3 1
复制
1 3 4
题意:求最大的p,满足[1, p] 任何区间的最小值的下标都相等
题解:假设前面的都符合了,在判断到第i个时,判断前面第一个比a[i], b[i] 小的位置k1, k2是否相同,因为在这个范围内,是a[i]和b[i]小,k1 k2 往前就是已经符合好的了
单调栈
#include
using namespace std;
const int N=1e5+5;
int a[N],b[N];
int qa[N],qb[N];
int ta,tb;
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]);
}
ta=0,tb=0;
int ans=0;
for(int i=1;i<=n;i++){
if(a[i]>qa[ta]&&b[i]>qb[tb]){
qa[++ta]=a[i];
qb[++tb]=b[i];
ans=i;
}
else if(a[i]