Link with Monotonic Subsequence(构造)

题意

定义lis为最长上升子序列,lds为最长下降子序列。

构造一个排列\(p\),使得\(\max (lis(p), lds(p))\)最小。

题目链接:https://ac.nowcoder.com/acm/contest/33187/G

数据范围

\(1 \leq n \leq 10^6\)

思路

最小值为\(\lceil \sqrt n \rceil\)

只需要构造形如\(3, 2, 1, 6, 5, 4, 9, 8, 7\)的排列即可。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int main()
{
    int T;
    scanf("%d", &T);
    while(T --) {
        int n;
        scanf("%d", &n);
        int B = ceil(sqrt(n));
        for(int l = 1; l <= n; l ++) {
            int r = min(n, l + B - 1);
            for(int i = r; i >= l; i --) {
                printf("%d ", i);
            }
            l = r;
        }
        printf("\n");
    }
    return 0;
}
posted @ 2022-08-23 16:14  pbc的成长之路  阅读(17)  评论(0编辑  收藏  举报