3048
区间伸缩推出每一个数字种类小于等于k+1的区间
一个区间中出现最多次数的数字既是一种可能的答案
取个max即可
#include #include #include #include #include #include #include #define eps 1e-5 #define For(i,j,k) for(int i=j;i<=k;++i) #define Dow(i,j,k) for(int i=k;i>=j;--i) #define ll long long #define maxn 1000000 using namespace std; inline ll read() { ll t=0,f=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} while(c<='9'&&c>='0') t=t*10LL+c-48LL,c=getchar(); return t*f; } map mp; int n,k,a[200001],cnt[200001],tot,ans; int main() { n=read();k=read();k++; For(i,1,n) a[i]=read(); For(i,1,n) {if(!mp[a[i]]) mp[a[i]]=++tot;a[i]=mp[a[i]];} int l=1,r=1; cnt[a[l]]=1; int kind=1; while(r<=n) { r++; cnt[a[r]]++; ans=max(ans,cnt[a[r]]); if(cnt[a[r]]==1) kind++; while(kind>k&&l<=r) { cnt[a[l]]--; if(cnt[a[l]]==0) kind--; l++; } } cout<