2019牛客暑期多校訓練營(第一場)A Equivalent Prefixes

題意:

定義了RMQ(u,L,R) 代表的是u數組中[L,R]中最小值的下標。現在給了A和B兩個數組。
要找到最長的m,使得任意的l,r滿足1<=L<=R<=m,能夠使得RMQ(A,L,R)==RMQ(B,L,R)。

思路:

可以這麼考慮,當已經確定了1<=L<=R<=p,都能使得RMQ的條件成立。然後討論p+1是否可以納入答案。
如果p+1,並不能被統計到答案裏,那麼一定是RMQ(A,x,p+1)!=RMQ(B,x,p+1)。(1<=x<=p)
也就是說,A[p+1]取到了A[x,p+1]的最小值,而B[p+1]沒有取到B[x,p+1]裏的最小值,纔會導致這倆式子不相等。所以,其實我們只要考慮到每個數,它能作用的範圍就好了,這個範圍要保證該數在範圍中是最小的。我們只要求出這倆數組的範圍,然後對每個數的範圍做比較,如果範圍相同,即可繼續往後比較,否則答案統計結束。

代碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn];
int l1[maxn],l2[maxn];
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]);
        for(int i=1;i<=n;i++)
        {
            l1[i]=i-1;
            int u=i;
            while(a[l1[u]]>a[i]) u=l1[u];
            l1[i]=u-1;
 
            l2[i]=i-1;
            u=i;
            while(b[l2[u]]>b[i]) u=l2[u];
            l2[i]=u-1;
        }
        l1[n+1]=0;
        l2[n+1]=1;
        int i;
        for(i=1;i<=n+1;i++)
        {
            if(l1[i]!=l2[i])
                break;
        }
        printf("%d\n",i-1);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章