2022牛客多校第九场

A Car Show

题意: 给定一个长度为n的数组,求包含1~n所有数的区间数量。

思路

用一个set容器存里面区间的数,用双指针遍历每一个符合条件的区间,每有一个符合的区间,左指针右移;若区间不符合条件,则右指针右移。用哈希表存包含的数。注意开longlong

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+3;
ll n,m;
ll a[N],vis[N];
int main(){
    scanf("%lld%lld",&n,&m);
    set<int> s;
    for(int i=0;i<n;i++)
        scanf("%lld",&a[i]);
    ll ans=0;
    for(int i=0,j=0;i<=n-m;i++){
        while(s.size()!=m) {
            vis[a[j]]++;
            s.insert(a[j]);
            j++;
            if(j>=n) break; 
        }
        if(s.size()==m) ans+=n-j+1;
        vis[a[i]]--;
        if(vis[a[i]]==0) s.erase(a[i]);
    }
    printf("%lld\n",ans);
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务