传送门:Cow Lineup
/**********************
题目来源:牛客假日团队赛45-B-Cow Lineup
题目链接:https://ac.nowcoder.com/acm/contest/6181/B
题目大意:有n头牛,每头牛都有一个编号,不同的牛可以共享一个编号,
问删掉k种编号的牛,最大可以有几头连续的牛编号相同
解题思路:尺取法(好久不写尺取复习一下),首先数据很大先离散化一下,
然后,l、r分别代表左右端点,维护一个区间,使得区间始终保持在牛的种类
小于等于k+1种,当等于k+2时,改变左端点的位置,每次更新ans,输出即可!
**********************/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5+5;
int a[maxn],s[maxn];//a离散化好的数据,s表示区间内当前编号牛的数量
int main()
{
int n,k,ans=0,cnt=0;
scanf("%d%d",&n,&k);
map<ll,int>mp;
for(int i=1;i<=n;i++){
ll x;
scanf("%lld",&x);
if(!mp[x]){
a[i]=++cnt;
mp[x]=cnt;
}
else a[i]=mp[x];///离散化
}
int l=1,r=0,p=0;
while(r<n){
r++;
if(!s[a[r]]) p++;//如果当前编号牛没有出现过,p++
s[a[r]]++;
while(p==k+2){
s[a[l]]--;///移动左端点
if(!s[a[l]]) p--;///如果当前牛编号被删除完,p--
l++;
}
ans=max(ans,s[a[r]]);///更新答案
}
printf("%d\n",ans);
return 0;
}