给出序列,先找出出现次数最多的元素,然后输出一个最短的 包含所有该元素的子序列 的两端点
直接输入时预处理好 每一个元素的最远的两个端点即可
vis标记个数,遍历找到最大的个数X,
然后在所有 个数为X的 元素 所在子序列的两端点之差最小的即可
暴力。。。。。wa了,一次 没考虑到 个数为1的情况,这时输出该元素位置两次即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define INF 0x7f7f7f7f
const __int64 maxn = 1000050;
int max(int a,int b)
{return a>b?a:b;}
int vis[maxn];
int a[maxn];
int posi[maxn][2];
int main()
{
int n,i;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]++;
if (posi[a[i]][0]==0)
posi[a[i]][0]=i;
else
if (posi[a[i]][1]==0)
{
posi[a[i]][1]=i;
if (posi[a[i]][1]<posi[a[i]][0])
swap(posi[a[i]][1],posi[a[i]][0]);
}
else
{
int d=posi[a[i]][1]-posi[a[i]][0];
int d1=abs(posi[a[i]][1]-i);
int d2=abs(i-posi[a[i]][0]);
int mind=max(d,max(d1,d2));
if (mind==d1)
posi[a[i]][0]=i;
if (mind==d2)
posi[a[i]][1]=i;
if (posi[a[i]][1]<posi[a[i]][0])
swap(posi[a[i]][1],posi[a[i]][0]);
}
}
int maxx=0;
int maxi=1;
for (i=1;i<=1000000;i++)
{
if (vis[i]>maxx)
{
maxx=vis[i];
maxi=i;
}
else
if (vis[i]==maxx)
{
int ds1=abs(posi[maxi][1]-posi[maxi][0]);
int ds2=abs(posi[i][1]-posi[i][0]);
if (ds2<ds1)
{
maxi=i;
}
}
}
if (maxx==1)
{
printf("%d %d\n",posi[maxi][0],posi[maxi][0]);
}
else
printf("%d %d\n",posi[maxi][0],posi[maxi][1]);
return 0;
}