There is a classical process named partition in the famous quick sort algorithm. In this process we typically choose one element as the pivot. Then the elements less than the pivot are moved to its left and those larger than the pivot to its right. Given N distinct positive integers after a run of partition, could you tell how many elements could be the selected pivot for this partition?
For example, given N=5 and the numbers 1, 3, 2, 4, and 5. We have:
Hence in total there are 3 pivot candidates.
译:著名的快速排序算法中有一个名为partition的经典过程。 在这个过程中,我们通常选择一个元素作为枢轴。 然后将小于枢轴的元素移到其左侧,将大于枢轴的元素移到其右侧。 在分区运行后给定 N 个不同的正整数,您能说出有多少元素可以作为该分区的选定主元吗?
例如,给定 N = 5 ,并且给定序列 1 , 3 , 2 , 4 , 5 ,有:
因此,总共有三个枢轴候选者。
Each input file contains one test case. For each case, the first line gives a positive integer N (≤ 105). Then the next line contains N distinct positive integers no larger than (≤ 109). The numbers in a line are separated by spaces.
译:每个输入文件包含一个测试用例。 对于每种情况,第一行给出一个正整数 N (≤ 105)。然后在下一行给出 N 个不大于 109 的正整数,并用空格分隔。
For each test case, output in the first line the number of pivot candidates. Then in the next line print these candidates in increasing order. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.
译:对于每种情况,在第一行打印枢轴候选者的数量。 然后在第二行,按升序输出所有枢轴候选者。 两个数字之间必须正好有一个空格分隔,并且行尾不能有多余的空格。
5 1 3 2 4 5
3 1 4 5
1 5 2 4 3
中,排序之后的序列为1 2 3 4 5
,其中数字 1
和4
的位置都没有发生变化,但是能够满足题题目意思的枢轴的候选者只有1
。这也就产生了作为枢轴候选者的第二个条件:枢轴候选者左边的最大值比枢轴小 (因为题目中说明了 N 个不同的数字)#include<bits/stdc++.h> using namespace std ; const int maxn = 100010 ; int a[maxn] , b[maxn]; vector<int> res ; int n , t , ans , preMax ; int main(){ scanf("%d" , &n) ; for(int i = 0 ; i < n ; i ++){ scanf("%d" , &t) ; b[i] = a[i] = t ; } sort(b , b + n) ; if(a[0] == b[0]) { ans ++ ; res.push_back(b[0]) ; preMax = a[0] ; } for(int i = 1 ; i < n ; i ++){ if(a[i] > preMax) preMax = a[i] ; // 记录区间 [0 , i] 之间数组的最大值 if(b[i] == a[i]){ // 位置未发生变化, 且为 [0 , i]内最大值,则为枢轴候选者 if(b[i] == preMax) { preMax = b[i] ; ans ++ ; res.push_back(b[i]) ; } } } printf("%d\n" , ans) ; for(int i = 0 ; i < ans ; i ++) printf("%d%c" , res[i] , ((i == ans -1)?'\n':' ')) ; if(ans == 0) printf("\n") ; // 有一个测试点为没有枢轴候选者的情况 return 0 ; }