题意:给出一个数字序列,问哪几个数字符合快排中pivot元素的性质。
思路:以快排为背景,实属逻辑题。pivot左边的值比它小,右边的值比它大。定义数组left[]和right[],其中left[i]表示区间[0~i-1]中的最大值,right[i]表示区间[i+1,n-1]的最小值,而符合条件的pivot只要满足data[i]>left[i] && data[i]<right[i]即可。在寻找符合条件的pivot之前要先把left[]和right[]预处理好,left[]的更新从左往右,可以在输入数据时同步更新,而right[]需要从右往左进行更新。
代码:
#include#include using namespace std;const int maxn=100005;int data[maxn],left[maxn],right[maxn];set ans;int main(){ int n,maxLeft=-1,minRight=1000000010; scanf("%d",&n); for(int i=0;i maxLeft) maxLeft=data[i]; } for(int i=n-1;i>=0;i--){ right[i]=minRight; if(data[i] < minRight) minRight=data[i]; } for(int i=0;i left[i] && data[i]