离散化一下然后贪心一下就好了
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <map>
using namespace std;
const int MAXN = 110000;
vector<int> s[MAXN];
set<int> myset;
map<int,int> mp;
int N, K, a[MAXN];
set<int>::iterator p;
int calc( int g ){
int ans, now;
int ft, ls;
ft = ls = 0;
ans = 1;
now = 0;
while( 1 ){
while( now <= K && ls < s[g].size() && ft < s[g].size() ){
if( ls == s[g].size() - 1 ){
break;
}
int temp = s[g][ls+1] - s[g][ls] - 1;
now += temp;
ls++;
if( now <= K ){
ans = max( ans, ls - ft + 1 );
}
}
if( ls == s[g].size() - 1 ){
while( now > K ){
now -= s[g][ft+1] - s[g][ft] - 1;
ft++;
}
ans = max( ans, ls - ft + 1 );
break;
}
while( now > K ){
now -= s[g][ft+1] - s[g][ft] - 1;
ft++;
}
}
return ans;
}
int main(){
while( scanf( "%d%d", &N, &K ) != EOF ){
myset.clear();
mp.clear();
for( int i = 1; i <= N; i++ ){
scanf( "%d", &a[i] );
myset.insert( a[i] );
}
int top;
for( p = myset.begin(), top = 1; p != myset.end(); p++, top++ ){
mp.insert( pair<int,int>( *p, top ) );
s[top].clear();
}
for( int i = 1; i <= N; i++ ){
a[i] = mp.find( a[i] )->second;
s[a[i]].push_back( i );
}
int ans = 0;
for( int i = 1; i < top; i++ ){
ans = max( ans, calc( i ) );
}
printf( "%d\n", ans );
}
return 0;
}