2019牛客暑期多校训练营(第一场)A-Equivalent Prefixes

题目描述
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 1lrm
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 pn 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 1n105
  • 1 ≤ 1≤ 1 a i a_i ai, b i ≤ n b_i≤n bin
  • 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 1lrm均有 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 1lrp满足 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 p1是满足题意的,那么我们只需要考虑对于任意 1 ≤ l ≤ p 1≤l≤p 1lp是否均满足 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[p1]的最小值的下标, m i n u [ 1 ] minu[1] minu[1] u [ 1 ] u[1] u[1] ~ u [ p − 1 ] u[p-1] u[p1]的最小值的下标,
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[i1]+1] v[p1]的最小值的下标, 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[i1]+1] u[p1]的最小值的下标( 2 ≤ i ≤ h 2≤i≤h 2ih)

  • 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 1lp均满足 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 p1
  • 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] 1lminu[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]+1lp的情况了,也就是分别拿 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 2jh出现 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值