Remove Extra one 维护前缀最大最小值
题意:去除一个数让所有前缀的最后一个数最大的个数最多。
思路:对于 任意j<i 如果去除j能让i成为最大值,那么 在a[j]是1~i的最大值且a[i]是次大值,那么启发我们从前往后扫描的时候维护最大和次大这两个变量,如果当前的x比最大值大,那么去除x对答案贡献为-1,如果x比次大值大,去除最大值对答案贡献为1,因为x是除去最大值的最大值。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
#define int long long
int a[100010];
signed main()
{
int n;
cin>>n;
int maxv=-1e9;
int maxvv=-1e9;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(x>maxv)
{
maxvv=maxv;
maxv=x;
a[x]=-1;
}
else if(x>maxvv)
{
a[maxv]++;
maxvv=x;
}
}
int res=-1e9;
int ans=-1;
for(int i=1;i<=n;i++)
if(a[i]>res)
{
ans=i;
res=a[i];
}
cout<<ans<<endl;
return 0;
}