#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
map<int,int>ma;
for(int i=1 ;i<=n;i++)
{
scanf("%d",&a[i]);
}
long long cnt=0;
int temp=0;
int l=1,r=1;
while(l<=r&&r<=n)
{
ma[a[r]]++;//记录数字出现的次数
if(ma[a[r]]==1)
temp++;//记录数字的种类数量
r++;
while(temp==m)
{//已经遇到过所有不同的数字
cnt+=n-r+2;//右端点右边有几个数+1
ma[a[l]]--;
if(ma[a[l]]==0)
{
temp--;
}
l++;
}
}
cout<<cnt;
return 0;
}
https://ac.nowcoder.com/acm/contest/33194/A
题目大意:有一个长度为n的数组,其中数的范围为1到m,问有多少个包含所有m个数至少各一个的区间
1<=m<=n<=1e5
思路:用尺取法,先记录遇到每个数的出现次数,同时记录出现过的不同数字的个数,如果当前出现过的数字个数等于m,统计答案当前区间右端点的右边还有多少数,同时左区间右移,维护每个数字的个数,如果当前不同数字的个数小于m了,就继续右移右端点