题目描述
Two arrays u and v each with m distinct elements are called equivalent if and only if
R
M
Q
(
u
,
l
,
r
)
=
R
M
Q
(
v
,
l
,
r
)
RMQ(u,l,r)=RMQ(v,l,r)
RMQ(u,l,r)=RMQ(v,l,r)
for all
1
≤
l
≤
r
≤
m
1≤l≤r≤m
1≤l≤r≤m
where
R
M
Q
(
w
,
l
,
r
)
RMQ(w,l,r)
RMQ(w,l,r) denotes the index of the minimum element among
w
w
wl,
w
w
wl+1,…,
w
w
wr
Since the array contains distinct elements, the definition of minimum is unambiguous.
Bobo has two arrays a and b each with
n
n
n distinct elements. Find the maximum number
p
≤
n
p≤n
p≤n where
a
1
,
a
2
,
…
,
a
p
{a_1,a_2,…,a_p}
a1,a2,…,ap and
b
1
,
b
2
,
…
,
b
p
{b_1,b_2,…,b_p}
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
n
n.
The second line contains
n
n
n integers
a
1
a_1
a1,
a
2
a_2
a2,…,
a
n
a_n
an
The third line contains n n n integers b 1 b_1 b1, b 2 b_2 b2,…, b n b_n bn.
- 1 ≤ n ≤ 10 1≤n≤10 1≤n≤105
- 1 ≤ 1≤ 1≤ a i a_i ai, b i ≤ n b_i≤n bi≤n
- a 1 , a 2 , … , a n {a_1,a_2,…,a_n} a1,a2,…,an are distinct.
- b 1 , b 2 , … , b n {b_1,b_2,…,b_n} b1,b2,…,bn are distinct.
- The sum of n n n does not exceed 5 × 10 5×10 5×105
输出描述:
For each test case, print an integer which denotes the result…
样例输入
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
题意
题目包含多组输入数据,每组数据相互独立。
题目定义了
R
M
Q
(
v
,
l
,
r
)
RMQ(v,l,r)
RMQ(v,l,r)的值是对于数组v,在
[
l
,
r
]
[l,r]
[l,r]内值最小的元素的下标。
而对于两个长度均为
m
m
m的数组u、v,若对于任意
1
≤
l
≤
r
≤
m
1≤l≤r≤m
1≤l≤r≤m均有
R
M
Q
(
u
,
l
,
r
)
=
R
M
Q
(
v
,
l
,
r
)
RMQ(u,l,r)=RMQ(v,l,r)
RMQ(u,l,r)=RMQ(v,l,r)则认为这两个数组是相等的。现在给出
n
n
n及两个长度为
n
n
n的数组,求最大的
p
p
p对于任意
1
≤
l
≤
r
≤
p
1≤l≤r≤p
1≤l≤r≤p满足
R
M
Q
(
u
,
l
,
r
)
=
R
M
Q
(
v
,
l
,
r
)
RMQ(u,l,r)=RMQ(v,l,r)
RMQ(u,l,r)=RMQ(v,l,r),并输出这个
p
p
p值。
思路
对于
p
=
1
p=1
p=1的情况显然满足题意,故
p
p
p的最小值为1。
考虑
p
>
1
p>1
p>1的情况,假设
p
−
1
p-1
p−1是满足题意的,那么我们只需要考虑对于任意
1
≤
l
≤
p
1≤l≤p
1≤l≤p是否均满足
R
M
Q
(
u
,
l
,
p
)
=
R
M
Q
(
v
,
l
,
p
)
RMQ(u,l,p)=RMQ(v,l,p)
RMQ(u,l,p)=RMQ(v,l,p)即可
设
m
i
n
v
[
1
]
minv[1]
minv[1]为
v
[
1
]
v[1]
v[1] ~
v
[
p
−
1
]
v[p-1]
v[p−1]的最小值的下标,
m
i
n
u
[
1
]
minu[1]
minu[1]为
u
[
1
]
u[1]
u[1] ~
u
[
p
−
1
]
u[p-1]
u[p−1]的最小值的下标,
m
i
n
v
[
i
]
minv[i]
minv[i]为
v
[
m
i
n
v
[
i
−
1
]
+
1
]
v
[
p
−
1
]
v[minv[i-1]+1] ~ v[p-1]
v[minv[i−1]+1] v[p−1]的最小值的下标,
m
i
n
u
[
i
]
minu[i]
minu[i]为
u
[
m
i
n
u
[
i
−
1
]
+
1
]
u
[
p
−
1
]
u[minu[i-1]+1] ~ u[p-1]
u[minu[i−1]+1] u[p−1]的最小值的下标(
2
≤
i
≤
h
2≤i≤h
2≤i≤h)
- 若
v
[
p
]
v[p]
v[p]<
v
[
m
i
n
v
[
1
]
]
v[minv[1]]
v[minv[1]]且
u
[
p
]
u[p]
u[p]<
u
[
m
i
n
u
[
1
]
]
u[minu[1]]
u[minu[1]]
那么显然对于任意 1 ≤ l ≤ p 1≤l≤p 1≤l≤p均满足 R M Q ( u , l , p ) = R M Q ( v , l , p ) = p RMQ(u,l,p)=RMQ(v,l,p)=p RMQ(u,l,p)=RMQ(v,l,p)=p,此时可将 m i n u [ 1 ] minu[1] minu[1]与 m i n v [ 1 ] minv[1] minv[1]均刷新为 p p p,且将 h h h置为1。 - 若
v
[
p
]
v[p]
v[p]<
v
[
m
i
n
v
[
1
]
]
v[minv[1]]
v[minv[1]]且
u
[
p
]
u[p]
u[p]>
u
[
m
i
n
u
[
1
]
]
u[minu[1]]
u[minu[1]]
或
v [ p ] v[p] v[p]> v [ m i n v [ 1 ] ] v[minv[1]] v[minv[1]]且 u [ p ] u[p] u[p]< u [ m i n u [ 1 ] ] u[minu[1]] u[minu[1]]
则必有 R M Q ( u , 1 , r ) ! = R M Q ( v , 1 , r ) RMQ(u,1,r)!=RMQ(v,1,r) RMQ(u,1,r)!=RMQ(v,1,r)(一个值为 p p p另一个不为 p p p)则 p p p不符合题意,答案为 p − 1 p-1 p−1 - 若
v
[
p
]
v[p]
v[p]>
v
[
m
i
n
v
[
1
]
]
v[minv[1]]
v[minv[1]]且
u
[
p
]
u[p]
u[p]>
u
[
m
i
n
u
[
1
]
]
u[minu[1]]
u[minu[1]]
那么显然对于任意 1 ≤ l ≤ m i n u [ 1 ] 1≤l≤minu[1] 1≤l≤minu[1]满足 R M Q ( u , l , p ) = R M Q ( v , l , p ) = m i n u [ 1 ] RMQ(u,l,p)=RMQ(v,l,p)=minu[1] RMQ(u,l,p)=RMQ(v,l,p)=minu[1],我们只需要考虑 m i n u [ 1 ] + 1 ≤ l ≤ p minu[1]+1≤l≤p minu[1]+1≤l≤p的情况了,也就是分别拿 v [ m i n v [ 2 ] ] v[minv[2]] v[minv[2]]与 v [ p ] v[p] v[p]比较,拿 u [ m i n u [ 2 ] ] u[minu[2]] u[minu[2]]与 u [ p ] u[p] u[p]比较 - 以此类推,若比到最后均符合,则
h
+
+
h++
h++,
m
i
n
v
[
h
]
=
m
i
n
u
[
h
]
=
p
minv[h]=minu[h]=p
minv[h]=minu[h]=p,
若对于 2 ≤ j ≤ h 2≤j≤h 2≤j≤h出现 v [ p ] v[p] v[p]< v [ m i n v [ j ] ] v[minv[j]] v[minv[j]]且 u [ p ] u[p] u[p]< u [ m i n u [ j ] ] u[minu[j]] u[minu[j]],则将 h h h置为 j j j, m i n v [ h ] = m i n u [ h ] = p minv[h]=minu[h]=p minv[h]=minu[h]=p
下面放上代码
#include<stdio.h>
#include<map>
#include<queue>
#include<iostream>
#include<algorithm>
#include<vector>
#define MOD 10000000007
using namespace std;
int a[100005],b[100005];
int a1[100005],b1[100005];
int h,n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
h=1;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
a1[h]=b1[h]=1;
int p;
for(p=2;p<=n;p++)
{
int j;
for(j=1;j<=h;j++)
if(a[a1[j]]>a[p]&&b[b1[j]]>b[p])break;
else if((a[a1[j]]<a[p]&&b[b1[j]]>b[p])||(a[a1[j]]>a[p]&&b[b1[j]]<b[p])) break;
if(j<=h) if((a[a1[j]]<a[p]&&b[b1[j]]>b[p])||(a[a1[j]]>a[p]&&b[b1[j]]<b[p])) break;
h=j;a1[h]=b1[h]=p;
}
p--;
printf("%d\n",p);
}
return 0;
}