Description:
You are given two integers and . You need to construct a rooted binary tree consisting of n vertices with a root at the vertex and the sum of depths of all vertices equals to .
A tree is a connected graph without cycles. A rooted tree has a special vertex called the root. A parent of a vertex is the last different from v vertex on the path from the root to the vertex v. The depth of the vertex is the length of the path from the root to the vertex . Children of vertex v are all vertices for which v is the parent. The binary tree is such a tree that no vertex has more than children.
You have to answer t independent test cases.
Input
The first line of the input contains one integer — the number of test cases.
The only line of each test case contains two integers and — the number of vertices in the tree and the required sum of depths of all vertices.
It is guaranteed that the sum of and the sum of both does not exceed .
Output
For each test case, print the answer.
If it is impossible to construct such a tree, print “ ” (without quotes) in the first line. Otherwise, print “{ }” in the first line. Then print integers in the second line, where is the parent of the vertex i. Note that the sequence of parents you print should describe some binary tree.
Example
input
3
5 7
10 19
10 18
output
YES
1 2 1 3
YES
1 2 3 3 9 9 2 1 6
NO
Note
Pictures corresponding to the first and the second test cases of the example:
解题思路:
给出
个节点深度和为
问你是否可以构成一个二叉树,可以的话输出全部节点深度。
全部节点组成一条链的话深度和肯定最大,我们就先组成一条链,然后每次移动最下面那个节点,看看移动到哪里合适,然后判断是否可以组成深度和为
。
AC代码:
const int N = 5e3 + 5;
int n, d;
int ans[N];
int ch[N];
int fa[N];
int c, now, mx;
int cnt, pos;
int get_dep()
{
int ans = now;
c++;
if (c == mx)
now++, mx *= 2, c = 1;
return ans;
}
int main()
{
int t;
sd(t);
while (t--)
{
mem(ch, 0);
sdd(n, d);
cnt = 0;
rep(i, 1, n - 1)
{
ans[i] = i;
cnt += i;
}
pos = n - 1;
now = 1, c = 1, mx = 2;
if (cnt < d)
{
puts("NO");
continue;
}
while (cnt > d)
{
int dep = get_dep();
if (dep >= pos)
break;
int tmp = cnt - d;
if (tmp >= (pos - dep))
{
cnt -= pos - dep;
ans[pos] = dep;
}
else
{
ans[pos] -= tmp;
cnt = d;
}
pos--;
}
if (cnt > d)
puts("NO");
else
{
puts("YES");
ans[0] = 0;
rep(i, 1, n - 1)
{
rep(j, 0, n - 1) if (ans[j] == ans[i] - 1 && ch[j] < 2)
{
ch[j]++;
fa[i] = j;
break;
}
}
rep(i, 1, n - 1)
{
printf("%d%c", fa[i] + 1, i == n - 1 ? '\n' : ' ');
}
}
}
return 0;
}