time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Amr has got a large array of size n. Amr doesn’t like large arrays so he intends to make it smaller.
Amr doesn’t care about anything in the array except the beauty of it. The beauty of the array is defined to be the maximum number of times that some number occurs in this array. He wants to choose the smallest subsegment of this array such that the beauty of it will be the same as the original array.
Help Amr by choosing the smallest subsegment possible.
Input
The first line contains one number n (1 ≤ n ≤ 105), the size of the array.
The second line contains n integers ai (1 ≤ ai ≤ 106), representing elements of the array.
Output
Output two integers l, r (1 ≤ l ≤ r ≤ n), the beginning and the end of the subsegment chosen respectively.
If there are several possible answers you may output any of them.
Sample test(s)
input
5
1 1 2 2 1
output
1 5
input
5
1 2 2 3 1
output
2 3
input
6
1 2 2 1 1 2
output
1 5
Note
A subsegment B of an array A from l to r is an array of size r - l + 1 where Bi = Al + i - 1 for all 1 ≤ i ≤ r - l + 1
这道题的意思是在数组中寻找出现次数最多的数字的区间,如果有多个数字出现的次数一样,那么就取区间最小的那一个区间,然后输出区间的左右端点。
首先输入数组时就把输入的数字当做下标,建立另外一个数组,数组上面的值就是那数字出现的次数,因为是什么数字出现最多次并不重要,所以不保存输入进去的数组,当然,这样做的话需要的内存挺大的,因为数字的范围大,然后对新数组进行排序,用结构体的话就可以同时计算那数字的区间了。
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct node
{
int num;
int R;
int L;
int flag;
};
bool cmp(node a,node b)
{
return a.num>b.num;
}
node number[1000010];
int main()
{
int n;
int big=0;
while(cin>>n)
{
int ans;
for(int i=0;i<n;i++)
{
cin>>ans;
number[ans].num++;
if(number[ans].flag==0) //保存数字的左右端点
{
number[ans].L=i;
number[ans].flag=1;
}
else number[ans].R=i;
big=big>ans?big:ans;
}
sort(number,number+big+1,cmp); //对数组进行排序
int right=0;
int left=0;
int nut=number[0].num;
if(nut==1)
{
right=number[0].L+1;
left=number[0].L+1;
}
else
{
int kk;
int min=1000010;
for(int i=0;i<n;i++)
{
if(number[i].num==nut) //如果有多个数字出现次数相同,取最小区间
{
kk=number[i].R-number[i].L;
if(kk<=min)
{
right=number[i].R+1;
left=number[i].L+1;
min=kk;
}
}
else break;
}
}
cout<<left<<" "<<right<<endl;
memset(number,0,sizeof(number));
}
return 0;
}