从左到右扫描时记录扫描到当前下标为止的最大值,如果当前元素大于这个最大值,那么它就大于它左边的所有值。同理,从右到左扫描记录扫描到当前下标为止的最小值,如果当前元素小于这个最大小值,那么它就小于它右边的所有值。
这样只需线性级别的时间。
第一次提交一个测试点格式错误,后来查看柳婼的博客发现当主元数为0时需要输出空行,因为题目要求输出两行,因此最后加一空行。
1 #include <iostream> 2 #include <vector> 3 #include <math.h> 4 #include <algorithm> 5 using namespace std; 6 7 8 int main() 9 { 10 int n; 11 cin >> n; 12 vector<bool> v1(n), v2(n); 13 vector<int> num(n); 14 int max = -1; 15 for (int i = 0; i < n; i++) 16 { 17 cin >> num[i]; 18 if (num[i] > max) 19 { 20 v1[i] = true; 21 max = num[i]; 22 } 23 } 24 int min = pow(10, 9) + 1; 25 for (int i = n - 1; i >= 0; i--) 26 { 27 if (num[i] < min) 28 { 29 v2[i] = true; 30 min = num[i]; 31 } 32 } 33 vector<int> result; 34 for (int i = 0; i < n; i++) 35 { 36 if (v1[i] && v2[i]) 37 result.push_back(num[i]); 38 } 39 cout << result.size() << endl; 40 sort(result.begin(), result.end()); 41 for (int i = 0; i < result.size(); i++) 42 { 43 if (i) cout << " "; 44 cout << result[i]; 45 } 46 cout << endl; 47 return 0; 48 }