做复杂了......
第一眼看题觉得是区间最值问题,就敲了个ST表(之前文章发过)。
ST表链接:ST表https://blog.csdn.net/qq_55799677/article/details/120599070
测试样例:
5
1 3 2 4 5
样例输出:
3
1 4 5
A题代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1e5 + 5;
int n, a[N], _log[N], f[N][50], m[N][50];
void pre()//预处理log
{
_log[0] = -1;
for (int i = 1; i <= n; i++) {
_log[i] = _log[i / 2] + 1;
}
memset(m, 0x3f, sizeof(m));
}
void init()//ST表板子
{
pre();
for (int i = 1; i <= n; i++) {
f[i][0] = m[i][0] = a[i];
}
int len = _log[n];
for (int j = 1; j <= len; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
m[i][j] = min(m[i][j - 1], m[i + (1 << (j - 1))][j - 1]);
}
}
}
int queryMin(int l, int r)//查最大值
{
int k = _log[(r - l + 1)];
return min(m[l][k], m[r - (1 << k) + 1][k]);
}
int queryMax(int l, int r)//查最小值
{
int k = _log[(r - l + 1)];
return max(f[l][k], f[r - (1 << k) + 1][k]);
}
int main()
{
vector<int>v;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
init();
for (int i = 1; i <= n; i++) {
if (a[i] == queryMax(1, i) && a[i] == queryMin(i, n)) {
v.push_back(a[i]);
}
}
cout << v.size() << endl;
for (int i = 0; i < v.size(); i++) {
if (i != 0) cout << ' ';
cout << v[i];
}
cout<<endl;//卡了一个测试点
return 0;
}