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