题意:给定一个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;
}