1 条题解

  • 0
    @ 2025-11-24 10:44:25
    // 二分+贪心 O(nlogn)
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 200010;
    int n, a[N];
    int len, b[N];      // 记录上升子序列
    int pos[N], ans[N]; // pos[i]=j 表示a[i]排在b序列中的j位置
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
    
        b[0] = -2e9; // 哨兵
        for (int i = 1; i <= n; i++)
        {
            if (b[len] < a[i])
            {
                b[++len] = a[i];
                pos[i] = len;
                // printf("%d %d\n",a[i],len);
            }
            else
            {
                int m = lower_bound(b + 1, b + len + 1, a[i]) - b;
                b[m] = a[i];
                pos[i] = m;
                // printf("%d %d:\n",a[i],m);
            }
        }
        for (int i = n, j = len; i >= 1 && j; i--)
        {
            if (pos[i] == j)
                ans[j--] = a[i];
        }
        for (int i = 1; i <= len; i++)
            printf("%d ", ans[i]);
        return 0;
    }
    
    • 1

    信息

    ID
    1909
    时间
    50ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    96
    已通过
    23
    上传者