2019牛客暑期多校训练营(第一场)

A .Equivalent Prefixes

这题有几种不同的方法,目前只会单调栈的写法

题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意子区间的最小值下标相等。

思路:用递归思想,假设前k个元素等价,即(a1,ak)和(b1,bk)等价,现在加入ak+1和bk+1,仍满足等价的条件是从右到左第一个小于ak+1的元素下标和第一个小于bk+1的元素的下标相等,所以就用到了单调栈(这个想法比较厉害)

至于为什么是等价的?分析可以得出,一个数字只能影响的区间范围是比他大的数的区间(以这个数为最小值,向两边扩展,他能向左扩展到第一个比该数小的数,向右也如此)

所以两个数组分别加入一个数,这个数字如果该数字能影响到的区间相同,则他们的最小值下标还是相同

例如,先假设p=i成立,那么当p=i+1时,要考虑的区间就是左端点[1,i] ~右端点i+1。先只考察一个数组的时候,很显然能发现的一个问题就是,因为这个题目只关心最小值,所以区间的左端点从i到1变化的时候,如果变化到j了发现a[j] < a[i+1],则左端点<=j那些区间肯定都不用看了,a[i+1]只承担左端点为j+1~i的最小值。

回到这个题目,所以只需要比较对于每个p,两个数组求出的j的值是否相同就可以了,如果不相同的话一定就GG。

Code

原文地址:https://www.cnblogs.com/wizarderror/p/11243312.html