我的思路:如果 pj+1>pj ,向右找上升子序列,如果,不满足,回到开头;如果 pj−1>pj ,向左找下降子序列,如果,不满足,回到开头。
为啥是错的?
附代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int p[100001];
int p1[100001];
int q[10001];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i];
p1[p[i]] = i;
}
for (int i = 1; i <= n; i++) {
int j = p1[i];
if (q[j]) continue;
int flag = -1;
int t = j;
cout << p[j] << ' ';
if (j > 1 && p[j - 1] > p[j] && (j + 1 <= n && p[j + 1] < p[j - 1])) flag = 1;
if (j < n && p[j + 1] > p[j] && p[j + 1] > (j > 1 ? p[j - 1] : INT_MIN)) flag = 2;
if (flag == 1) {
while (j > 1 && p[j - 1] < p[j] && !q[j - 1]) {
j--;
q[j] = t;
cout << p[j] << ' ';
}
}
if (flag == 2) {
while (j < n && p[j + 1] > p[j] && !q[j + 1]) {
j++;
q[j] = t;
cout << p[j] << ' ';
}
}
}
return 0;
}