测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A16522. Binary Search with One Swap

编程题 省选/NOI-
知识点

题目描述

考虑以下在一个长度为 $n$ 的数组 $a$ 中查找整数 $x$ 的算法,数组元素从 $1$ 到 $n$ 编号:

1. 初始化 $l = 1$ 和 $r = n$;
2. 如果 $l > r$,结束算法并报告未找到目标元素;
3. 计算 $m = \lfloor \frac{l + r}{2} \rfloor$;
4. 如果 $a_m = x$,结束算法并报告找到目标元素;
5. 如果 $a_m < x$,令 $l = m + 1$,否则令 $r = m - 1$;
6. 转到步骤 $2$。

可以证明,如果数组 $a$ 是非递减有序的,那么该算法一定能成功找到 $a$ 中的任意元素。

你的任务如下:对于给定的 $n$,考虑所有满足 $1 \le i < j \le n$ 的数对 $(i, j)$。对于每个这样的数对,你需要计算它的**优美度**——即如果我们取数组 $a = [1, 2, 3, \dots, n]$ 并交换元素 $a_i$ 和 $a_j$,那么上述算法能够成功找到的整数 $x$(从 $1$ 到 $n$)的数量。然后,对于每个 $k$ 从 $0$ 到 $n$,你需要输出 $p_k$——优美度为 $k$ 的数对数量。

输入格式

输入仅有一行,包含一个整数 $n$($3 \le n \le 5 \cdot 10^6$)。

输出格式

输出 $n+1$ 个整数 $p_0, p_1, \dots, p_n$,其中 $p_k$ 是优美度为 $k$ 的数对 $(i, j)$ 的数量。

输入输出样例

输入 #1
4
输出 #1
0 0 3 3 0

说明/提示

考虑 $n = 4$ 的示例:

- 如果交换 $a_1$ 和 $a_2$,那么 $1$、$3$ 和 $4$ 可以被成功找到;
- 如果交换 $a_1$ 和 $a_3$,那么 $2$ 和 $4$ 可以被成功找到;
- 如果交换 $a_2$ 和 $a_3$,那么 $1$、$3$ 和 $4$ 可以被成功找到;
- 如果交换 $a_1$ 和 $a_4$,那么 $2$ 和 $3$ 可以被成功找到;
- 如果交换 $a_2$ 和 $a_4$,那么 $1$ 和 $4$ 可以被成功找到;
- 如果交换 $a_3$ 和 $a_4$,那么 $1$、$2$ 和 $4$ 可以被成功找到。
上一题 去做题 下一题