昨天小月赛的T2到底咋做呀?
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/15 11:08
  • 上次更新2024/12/15 14:32:18
查看原帖
昨天小月赛的T2到底咋做呀?
1001535
封禁用户楼主2024/12/15 11:08

我的思路:如果 pj+1>pjp_{j+1}>p_j ,向右找上升子序列,如果,不满足,回到开头;如果 pj1>pjp_{j-1}>p_j ,向左找下降子序列,如果,不满足,回到开头。

为啥是错的?

附代码:

#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;
}
2024/12/15 11:08
加载中...