C. The Phone Number
Mrs. Smith is trying to contact her husband, John Smith, but she forgot the secret phone number!
The only thing Mrs. Smith remembered was that any permutation of nn can be a secret phone number. Only those permutations that minimize secret value might be the phone of her husband.
The sequence of nn integers is called a permutation if it contains all integers from 11 to nn exactly once.
The secret value of a phone number is defined as the sum of the length of the longest increasing subsequence (LIS) and length of the longest decreasing subsequence (LDS).
A subsequence ai1,ai2,…,aikai1,ai2,…,aik where
For example, if there is a permutation [6,4,1,7,2,3,5][6,4,1,7,2,3,5], LIS of this permutation will be [1,2,3,5][1,2,3,5], so the length of LIS is equal to 44. LDScan be [6,4,1][6,4,1], [6,4,2][6,4,2], or [6,4,3][6,4,3], so the length of LDS is 33.
Note, the lengths of LIS and LDS can be different.
So please help Mrs. Smith to find a permutation that gives a minimum sum of lengths of LIS and LDS.
InputThe only line contains one integer nn (1≤n≤1051≤n≤105) — the length of permutation that you need to build.
OutputPrint a permutation that gives a minimum sum of lengths of LIS and LDS.
If there are multiple answers, print any.
Examples input Copy4output Copy
3 4 1 2input Copy
2output Copy
2 1Note
In the first sample, you can build a permutation [3,4,1,2][3,4,1,2]. LIS is [3,4][3,4] (or [1,2][1,2]), so the length of LIS is equal to 22. LDS can be ony of [3,1][3,1], [4,2][4,2], [3,2][3,2], or [4,1][4,1]. The length of LDS is also equal to 22. The sum is equal to 44. Note that [3,4,1,2][3,4,1,2] is not the only permutation that is valid.
In the second sample, you can build a permutation [2,1][2,1]. LIS is [1][1] (or [2][2]), so the length of LIS is equal to 11. LDS is [2,1][2,1], so the length of LDS is equal to 22. The sum is equal to 33. Note that permutation [1,2][1,2] is also valid.
題意 : 給一個數 n, 求一個長度為 n 的排列,使得該排列的 lis長度 + lds 長度 最小。
思路:取 ans = x + y (x 表示 lis 長度,y 表示 lds 長度) 那麽 先將 n 個數字分成 p 塊,使每個塊中單調遞增序列,令 p 塊中的數字都為相鄰的數。例如 n=9 時,令 塊一:123、塊二:456、塊三:789,要是 x + y最小,我們可以得出當排列為塊三、塊二、塊一時最小,即 ans = n/p+p。由數學不等式得 : n/p+p>=2*sqrt(n),即p==sqrt(n)時,ans取最小值 2*sqrt(n) 。由特殊到一般的歸納法,我們即可推出規律。
代碼如下:
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; int n; int main(){ scanf("%d",&n); int m=sqrt(n); for (int i=0; i<n; i++) printf("%d ",max(0,n-m*(i/m+1))+i%m+1); return 0; }
C. The Phone Number