链接:https://ac.nowcoder.com/acm/contest/881/A

来源:牛客网

Equivalent Prefixes

时间限制:C/C++ 2秒,其他语言4秒

空间限制:C/C++ 524288K,其他语言1048576K

64bit IO Format: %lld

题目描述

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) for all

1



l



r



m

1≤l≤r≤m

where

R

M

Q

(

w

,

l

,

r

)

RMQ(w,l,r) denotes the index of the minimum element among

w

l

,

w

l

+

1

,



,

w

r

wl,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



n

p≤n where

{

a

1

,

a

2

,



,

a

p

}

{a1,a2,…,ap} and

{

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.

The second line contains n integers

a

1

,

a

2

,



,

a

n

a1,a2,…,an.

The third line contains n integers

b

1

,

b

2

,



,

b

n

b1,b2,…,bn.

1



n



10

5

1≤n≤105

*

1



a

i

,

b

i



n

1≤ai,bi≤n

*

{

a

1

,

a

2

,



,

a

n

}

{a1,a2,…,an} are distinct.

*

{

b

1

,

b

2

,



,

b

n

}

{b1,b2,…,bn} are distinct.

  • The sum of n does not exceed

    5

    ×

    10

    5

    5×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

题意:

给你两个数组a,b,大小为n,让你寻找一个数p (1<= p <= n) ,使之在 1~p 任意一个区间中a,b数组的最小值下标相同。

思路:

容易知道p的取值具有单调性,首先我们用st表在对数组a,b进行预处理,方便后续的RMQ,因为数组中的数相互不同,那么我们就可以直接RMQ获得区间最小值下标。

在二分p的过程中,我们这样来判断mid是否合法:

询问1~mid 区间两个数组中的最小值下标是否一致,如果不一致直接返回false,否则 以最小值下标minid为分界点递归处理1minid,minid+1mid。这个过程是O(n)的

所以总体时间复杂度是 O( n* log n )

细节见代码:

#include<iostream>
using namespace std;
const int maxn=2e5+10;
int n;
int a[maxn],b[maxn];
int sa[maxn][20],sb[maxn][20],mn[maxn];
void init()
{
mn[0]=-1;
for (int i=1;i<=n;i++)
{
mn[i]=((i & (i-1))==0) ? mn[i-1]+1 : mn[i-1];
sa[i][0]=a[i];
sb[i][0]=b[i];
}
for (int j=1;j<=mn[n];j++)
for (int i=1;i+(1<<j)-1<=n;i++)
{
sa[i][j]=min(sa[i][j-1],sa[i+(1<<(j-1))][j-1]);
sb[i][j]=min(sb[i][j-1],sb[i+(1<<(j-1))][j-1]);
}
}
int ida[maxn];
int idb[maxn];
int rqa(int L,int R)
{
int k=mn[R-L+1];
// cout<<"a "<<min(sa[L][k],sa[R-(1<<k)+1][k])<<endl;
return ida[min(sa[L][k],sa[R-(1<<k)+1][k])];
}
int rqb(int L,int R)
{
int k=mn[R-L+1];
// cout<<"b "<<min(sb[L][k],sb[R-(1<<k)+1][k])<<endl;
return idb[min(sb[L][k],sb[R-(1<<k)+1][k])];
}
bool pan(int l,int r)
{
if(l>=r)
{
return 1;
}
int w=rqb(l,r);
int q=rqa(l,r);
if(w!=q)
{
return 0;
}else{
return pan(l,w-1)&&(pan(q+1,r));
}
}
bool check(int mid)
{
// bool res=1;
return pan(1,mid);
}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
ida[a[i]]=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
idb[b[i]]=i;;
}
init();
int l=1;
int r=n;
int mid;
int ans=1;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
l=mid+1;
ans=mid;
}else{
r=mid-1;
} }
printf("%d\n",ans);
}
}

2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)的更多相关文章

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  3. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  4. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  5. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  6. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  7. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  8. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  9. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

随机推荐

  1. 全面解读PHP-数据库缓存

    一.什么是数据库缓存? 1.定义 mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删改查的操作会造成巨大的IO开销和查询压力,这无疑对数据库和服务 ...

  2. 清明 DAY 3

    ans=1000*4 分别固定千位,百位,十位,个位为1,其余位置随便排 对于每一个质因数的n次方,共有n+1中选择方法,即这个质因数的0~n次方 故共有   4*3*5=60  种方法 (1)取两册 ...

  3. 方差分析(python代码实现)

    python机器学习-乳腺癌细胞挖掘(欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章) https://study.163.com/course/introduction ...

  4. vuex里面的store架构

    将store文件夹分为四个文件夹,分别是actions,getters,mutations,state. action:和mutatation功能是类似的,都是修改state里面的数据,区别是acti ...

  5. Error-ASP.NET:在从服务器接收结果时发生传输级错误。 (provider: Session Provider, error: 19 - 物理连接不可用)

    ylbtech-Error-ASP.NET:在从服务器接收结果时发生传输级错误. (provider: Session Provider, error: 19 - 物理连接不可用)  1.返回顶部 1 ...

  6. EMQ插件组合实现物联网边缘平台的设备通信管理

    上一篇随笔我简单的记录了我对EMQ插件开发的了解过程,最后发现还是可以组合复用已有插件,因此这篇随笔用于记录使用的情况以及是否达到预期. 首先测试mysql认证插件的使用方式: emqx_auth_m ...

  7. 谈谈 UI 中, Padding 和 Margin 有什么区别?

    android:padding 和 android:layout_margin 的区别,其实概念很简单,padding 是站在父 view 的角度描述问题,它规定它里面的内容必须与这个父 view 边 ...

  8. LoadRunner运行时异常处理

    VuGen提供了错误处理函数lr_continue_on_error,用来在脚本中实时修改Vuser的出错设置.lr_continue_on_error函数语法结构如下: Loadrunner在运行过 ...

  9. 阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils

    不是没有事务造成的 这样相当于有四个connection 每一个都有自己独立的事物 每一个自己成功就提交事务. 已经提交的就执行结束.没有提交的就报异常 让这些操作使用同一个connection 事物 ...

  10. 意想不到的JavaScript(每日一题1)

    问题: 答案: 解析: