题意:给一个N个数的排列,要求移走一个数,使得record数最多。record数就是这个数比排在它前面的数都大
思路:如果a[i]如果是a[1..i]中最大的数字那么record会减少1。对于任意一个a[j],i<j且a[i]是a[1..j]中最大的数字,且a[j]是a[1..j]中第二大的数字,删掉a[i]后,a[j]都会成为一个record,即record数递增
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int c[maxn];
int lowbit(int x) {
return x&(-x);
}
void add(int x,int i) {
while(i<=maxn) {
c[i]+=x;
i+=lowbit(i);
}
}
int getsum(int x) {
int sum=0;
while(x>0) {
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int a[maxn];
int b[maxn];
int main() {
int n;
while(scanf("%d",&n) != EOF) {
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
add(1,a[i]);
// b[i]=getsum(a[i]);
}
if(n==1) {
cout<<1<<endl;
continue;
}
memset (b,0,sizeof(b));
// for(int i=1;i<=n;i++) {
// printf("%d ",b[i]);
// }
int maxx=max(a[1],a[2]),minn=min(a[1],a[2]);
int ans=minn;
if(a[1] < a[2]) {
b[a[1]]=-1;
b[a[2]]=-1;
}
else {
b[a[1]]=0;
b[a[2]]=0;
}
for(int i=3;i<=n;i++){
if(a[i]>maxx) {
minn=maxx;
maxx=a[i];
b[a[i]]=-1;
}
else if(a[i]<maxx&&a[i]>minn){
minn=a[i];
++b[maxx];
}
}
int t=1;
for(int i=1;i<=n;i++) {
//cout<<b[i]<<" ";
if(b[i]>b[t]) t=i;
}
//cout<<endl;
cout<<t<<endl;
}
}