题目链接:
题目大意:
给出一个序列,问如何截取连续的子序列,能够得到的子序列的出现次数最多的数的数目不变
题目分析:
记录每个数出现的次数和最左位置以及最右位置,然后判断出现次数等于最大次数的最左和最右位置间隔最小的下标即为最终答案
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 100007
#define M 1000007
using namespace std;
int n;
int a;
int num[M];
int l[M];
int r[M];
int maxn;
int main ( )
{
while ( ~scanf ( "%d" , &n ))
{
maxn = 0;
memset ( l , -1 , sizeof (l));
memset ( r, -1 , sizeof (r));
memset ( num , 0 , sizeof ( num ));
for ( int i = 1 ; i <= n ; i++ )
{
scanf ( "%d" , &a );
num[a]++;
if ( l[a] == -1 ) l[a] = i;
r[a] = i;
}
for ( int i = 0 ; i < M ; i++ )
maxn = max ( maxn , num[i] );
int ans1,ans2,sum=M;
for ( int i = 0 ; i < M ; i++ )
if ( num[i] == maxn )
{
if ( sum > r[i]-l[i]+1)
{
sum = r[i]-l[i]+1;
ans1 = l[i];
ans2 = r[i];
}
}
printf ( "%d %d\n" , ans1 , ans2 );
}
}