牛客周赛45
D
using namespace std;
typedef long long ll;
const int N=100010;
ll color[N],laco[N];//laco最后一个颜色的位置
ll n,k,ans=0;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);//提高输出效率
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>color[i];
}
for(ll l=1,r=0;l<=n;l++){
while(r<n&&(!laco[color[r+1]]||r+1-laco[color[r+1]]<=k))
{
r++;
laco[color[r]]=r;//laco代表最后一个color[r]所在的位置
}
if(laco[color[l]]==l) laco[color[l]]=0;//判断将要出来的数字是否是队列的最后一个
ans+=r-l+1;//找到最大的一个对列,里面的小队列全是符合条件的
}
cout<<ans<<endl;
return 0;
}

查看1道真题和解析