O(nlogn)的时间复杂度
emmmmm......
#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define sz(x) (int)x.size()
const int N=1e6 + 10;
int n, s[N];
int mx, mx_num;
void f(int l, int r)
{
if (r-l+1<=mx_num||l==r)return; // 长度小于等于mx_num或者只有一个元素,结束
int val=s[l];// 选择基准值
int ll=l,rr=r;// 指向两个端点
while(ll!=rr)// 类似快排
{
while (ll!=rr&&s[rr]>val)rr--; // 右指针向左移动,找到一个小于或等于基准值的元素
s[ll]=s[rr];// 放到左指针
while(ll!=rr&&s[ll]<=val)ll++;// 左指针向右移动,找到一个大于基准值的元素
s[rr] = s[ll]; // 放到右指针
}
s[ll]=val;// 把基准值放到ll的位置
int num=0;
for (int i=l;i<=r;i++)
if(s[i]==val)num++; //计数
if (mx_num<num){ // 如果当前基准值的出现次数超过之前记录的最大次数,更新最大次数及对应元素
mx_num=num;
mx=val;
}
f(l, ll - 1);// 处理左边的子区间
f(rr + 1, r);// 处理右边的子区间
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>s[i];
f(1,n);
cout<<mx<<" "<<mx_num;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
solve();
return 0;
}