
 
 思路:
 开始完全没有思路,还是想问题的方法不对(应该先暴力模拟,然后再想可以优化的方法)。
 后来看了解析,用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;
}
                













![[渗透测试] 主动信息收集](https://i-blog.csdnimg.cn/direct/66e9fc070414424a932d2fc372d0aecf.png#pic_center)



