思路:
开始完全没有思路,还是想问题的方法不对(应该先暴力模拟,然后再想可以优化的方法)。
后来看了解析,用chang[]来存储每个元素删除后(或者是该元素前面的元素删除后)对record造成的影响,先枚举每个元素是否删除,然后用树状数组来计算该元素i是否满足record规则,
如果满足(比当前元素小的数有i-1个),则删除i会导致change[i]–(即record减少一个)
如果不满足,但若是比当前元素小的数有i-2个,则说明前面i-1个数中有个数k比当前元素i大,则删除k就可以使元素i满足record,则chang[i]++。
最后遍历整个排列,record[]最大的元素就是“使得从排列中取出这个元素以后排列的records最多的”。
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define LL long long int
const int MAXN=1e5+2;
int n;
int c[MAXN],change[MAXN];
int lowbit(int x){
return x&-x;
}
void add(int pos,int x){
for(int i=pos;i<=n;i+=lowbit(i)){
c[i]+=x;
}
}
int sum(int pos){
int ans=0;
for(int i=pos;i>0;i-=lowbit(i)){
ans+=c[i];
}
return ans;
}
int main(){
scanf("%d",&n);
int maxx=-1;
int x;
for(int i=1;i<=n;++i){
scanf("%d",&x);
maxx=max(x,maxx);
int cnt=sum(x);
if(cnt==i-1)
--change[x];
else if(cnt==i-2)
++change[maxx];
add(x,1);
}
int ans=1,maxA=change[1];
for(int i=2;i<=n;++i)
{
if(change[i]>maxA){
ans=i;
maxA=change[i];
}
}
printf("%d\n",ans);
return 0;
}