狠狠地切割(Easy Version)

题意:给定一个a数组,然后在数组中把属于b数组的数字删掉,变为隔板,问最后分割成了几个区间

思路:

  • 我们可以发现bi的范围在2e6,那么我们可以对属于b数组的数字进行标记,如果b数组中有6,我们标记vis[6]=true。

  • 然后我们对a数组进行遍历,当我们遍历到已经被标记的数字,我们就考虑它被删去之后会增加几个区间,我们记录一下这个数字之前有几个有效数字,数量我们记为k,如果k>0,那么说明我们把当前的被标记过的数字从a中删除后,会增加一个区间,比如 假设3被标记过了, 1 3 4这个数组 ,我们3左边是有数字的,我们把3 删除换为隔板之后,我们的区间就是两个,就多了一个,如果是 3 4 5这个数组,3左边没有数字,我们可以发现3被删除后,区间个数还是1,没有增加,因此我们用k记录一下即可

  • 最后判断一下边界问题,假设我们3被标记,最后的区间是 3 4 ,那么我们最后的把3删除后,ans加的是左边的区间,右边还有一个区间,所以当最后一个数不是被标记的数,我们ans得再++,当最后的区间是4 3 这种,我们3右边没有区间,因此可以不加

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
ll a[600000],b[600000];
ll vis[6000000], ans;
int main(){
    cin>>n>>m;
    for (int i = 0; i < n; ++i) {
        cin>>a[i];
        vis[i]=1;
    }
    for (int i = 0; i < m; ++i) {
        cin>>b[i];
        vis[b[i]]=3;
    }
    int k=0;
    int l;
    for (int i = 0; i <n; ++i) {
        if(vis[a[i]]!=3)
            k++;
        if(vis[a[i]]==3){
            if(k>0)
                ans++;
            k=0;
            l=i;
        }
    }
    if(l!=n-1)
        ans++;
    cout<<ans;
}
posted on 2023-07-22 23:16  IR101  阅读(47)  评论(0编辑  收藏  举报  来源