题意
定义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;
}