题解:http://blog.csdn.net/csuhoward/article/details/38366737
#include<bits/stdc++.h> using namespace std; map<int,int> rr; vector<int> v[100005]; int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ rr.clear(); int a,c=-1; for(int i=0;i<n;++i){ v[i].clear(); scanf("%d",&a); if(!rr.count(a)) rr[a]=++c; v[rr[a]].push_back(i); } int maxx=0; for(int i=0;i<=c;++i){ int l=0,r=0,num=0,sum=0; //num是已经用了多少次特效,sum是已经得到多少个连续值 for(;r<v[i].size();){ if(r==0||num+(v[i][r]-v[i][r-1]-1)<=m){ if(r==0){ sum++; r++; } else{ num+=v[i][r]-v[i][r-1]-1; sum++; r++; } } else{ sum--; num-=v[i][l+1]-v[i][l]-1; l++; } maxx=max(maxx,sum); } } printf("%d\n",maxx); } return 0; }
#include<bits/stdc++.h> using namespace std; map<int,int> rr; vector<int> v[100005]; int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ rr.clear(); int a,c=-1; for(int i=0;i<n;++i){ v[i].clear(); scanf("%d",&a); if(!rr.count(a)) rr[a]=++c; v[rr[a]].push_back(i); } int maxx=0; for(int i=0;i<=c;++i){ int l=0,r=0,num=0,sum=1; //num是已经用了多少次特效,sum是已经得到多少个连续值 while(r<v[i].size()){ if(num>m){ num-=v[i][l+1]-v[i][l]-1; sum--; l++; continue; } maxx=max(maxx,sum); r++; num+=v[i][r]-v[i][r-1]-1; //这里有越界,但是过了 sum++; } } printf("%d\n",maxx); } return 0; }
#include<bits/stdc++.h> using namespace std; map<int,int> rr; vector<int> v[100005]; int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ rr.clear(); int a,c=-1; for(int i=0;i<n;++i){ v[i].clear(); scanf("%d",&a); if(!rr.count(a)) rr[a]=++c; v[rr[a]].push_back(i); } int maxx=0; for(int i=0;i<=c;++i){ int l=0,r=0; while(r<v[i].size()){ if((v[i][r]-v[i][l]+1)-(r-l+1)>m){ l++; continue; } maxx=max(maxx,r-l+1); r++; } } printf("%d\n",maxx); } return 0; }