2021 TPC 腾讯程序设计竞赛 第一季

第一季赛程:4 月 6-11 日赛前体验,4 月 13 日周二晚 19-21 点第一场比赛,4 月 20 日周二晚 19-21 点第二场比赛。

名称 编号 备注 题解
A. Beautiful Sequence(美丽序列) 题解见下
B. Chocolate Bars(巧克力棒) 题解见下
C. Perfect Square(完全平方数) 题解见下
D. Ants(蚂蚁)
E. Numbers on the Chessboard(棋盘上的数字)
A. Strange Sorting(奇怪的排序)
B. Number of Zeros(零的个数)
C. Minimum Spanning Tree(最小生成树) 题解见下
D. Divisible Continuous Subsequence(可整除连续子序列)
E. Arrange the Matrices(排列矩阵)

第 1 题:A. Beautiful Sequence(美丽序列)

题面

1-A Beautiful Sequence(美丽序列)

题目描述

一个序列 $b_1,b_2,\cdots,b_n$ 是美丽序列当对于所有 $1 \le i<n$ 有 $b_i \times b_{i+1} \le 0$。

给定一个整数序列 $a_1,a_2,\cdots,a_n$,问是否可以通过重新排列其中的元素使其变为美丽序列。

输入

有多组测试数据。第一行输入一个整数 $T$ 代表测试数据组数。对于每组测试数据:

第一行输入一个整数 $n$($2 \le n \le 10^5$)表示序列的长度。

第二行输入 $n$ 个整数 $a_1,a_2,\cdots,a_n$($−10^9 \le a_i \le 10^9$)表示序列的元素。

保证所有数据 $n$ 之和不超过 $10^6$。

输出

每组数据输出一行。若可以通过重新排列使得序列变为美丽序列输出 "Yes"(不输出引号);否则输出 "No"(不输出引号)。

做法 1

记录负数的个数 $\mathrm{cnt\_ne}$、零的个数 $\mathrm{cnt\_0}$ 和正数的个数 $\mathrm{cnt\_po}$。显然不能有两个连续的正数或两个连续的负数,则当且仅当 $\mathrm{cnt\_ne}+\mathrm{cnt\_0} \ge \mathrm{cnt\_po}-1$ 且 $\mathrm{cnt\_po}+\mathrm{cnt\_0} \ge \mathrm{cnt\_ne}-1$ 时,可以构造出“美丽数列”。

备份

第 2 题:B. Chocolate Bars(巧克力棒)

题面

1-B Chocolate Bars(巧克力棒)

题目描述

您有 $n$ 根长度为整数的巧克力棒,长度依次为 $a_1,a_2,\cdots,a_n$。您想要选择其中一根巧克力棒,并将它分成两根长度均为整数且更短的巧克力棒,使得最后得到的 $(n+1)$ 根巧克力棒长度互不相同。求有几根巧克力棒可被选择。

更正式地,给定 $n$ 个整数 $a_1,a_2,\cdots,a_n$,您需要选择两个整数 $k$ 和 $x$ 使得

求有多少个不同的 $k$ 可以选择。

输入

有多组测试数据。第一行输入一个整数 $T$($1 \le T \le 50$)代表测试数据组数。对于每组测试数据:

第一行输入一个整数 $n$($1 \le n \le 10^5$)表示巧克力棒的数量。

第二行输入 $n$ 个整数 $a_1,a_2,\cdots,a_n$($1 \le $a_i$ \le 1000$)表示巧克力棒的长度。

保证所有数据 $n$ 之和不超过 $10^6$。

输出

每组数据输出一行一个整数,表示可以被选择的巧克力棒的数量。

做法 1

由于 $1 \le a_i \le 1000$,根据抽屉原理,当 $n>1000$ 时,必然有两个巧克力棒长度相同,答案为 $0$。

这样,$n$ 的范围就限定在 $[1,1000]$ 的范围内,可以使用 $O(n^2)$ 的朴素算法。

需要注意以下几点:

备份

第 3 题:C. Perfect Square(完全平方数)

题面

1-C Perfect Square(完全平方数)

题目描述

给定两个整数 $n$ 与 $k$,请构造一个长度为 $n$ 的整数序列 $a_1,a_2,\cdots,a_n$($1 \le a_i \le 10^5$)使得满足以下要求的二元组 $(i,j)$ 的数量恰为 $k$:

请回忆:完全平方数是一个整数,其平方根也是整数。

输入

有多组测试数据。第一行输入一个整数 $T$($1 \le T \le 200$)代表测试数据组数。对于每组测试数据:

第一行输入两个整数 $n$ 与 $k$($1 \le n \le 100$,$0 \le k \le 10^4$)。

输出

对于每组数据,若符合要求的序列存在,首先输出一行 "Yes"(不输出引号),并在接下来的一行中输出 $n$ 个由单个空格分隔的整数 $a_1,a_2,\cdots,a_n$。请注意,您的答案需要满足 $1 \le a_i \le 10^5$;若不存在符合要求的序列,输出一行 "No"(不输出引号)即可。

如果有多种合理答案,您可以输出任意一种。

请勿在行末输出多余空格,否则您的答案可能会被认为是错误的。

做法 1

当任意两个数之和均为完全平方数时,满足要求的二元组的数量 $k$ 为最大值 $\dfrac{n \times (n-1)}{2}$。

于是我们大胆猜测:对于任意一个 $k \le \dfrac{n \times (n-1)}{2}$,都有解。设 $k'$ 表示不满足要求的二元组的数量,则 $k'=\dfrac{n \times (n-1)}{2}-k$。

当 $k'=0$ 时,直接让数列的每一项都是 $2$ 即可。否则,可以使用以下两种方法来增加不满足要求的二元组的数量:

举一个例子:当 $n=5,k=5$ 时:

备份

第 8 题:C. Minimum Spanning Tree(最小生成树)

题面

2-C Minimum Spanning Tree(最小生成树)

题目描述

给定一张连通图,该图有 $n$ 个点以及 $m$ 条带有边权的无向边,且 $n$ 个点中有 $k$ 个点是特殊的。求该图的一棵生成树满足

请回忆:生成树是原图的连通子图,该连通子图含有 $n$ 个点以及 $n−1$ 条边。另外,叶子指的是树上恰有一条边与其相连的点。

输入

有多组测试数据。第一行输入一个整数 $T$ 代表测试数据组数。对于每组测试数据:

第一行输入两个整数 $n$ 和 $m$($2 \le n \le 10^5$,$n−1 \le m \le 10^5$)表示图的点数和边数。

对于接下来的 $m$ 行,第 $i$ 行输入三个整数 $u_i$,$v_i$ 和 $w_i$($1 \le u_i$,$v_i \le n$,$1 \le w_i \le 10^9$)表示有一条边权为 $w_i$ 的边连接点 $u_i$ 和 $v_i$。保证输入的图是连通的,但可能有自环或重边。

下一行输入一个整数 $k$($1 \le k \le n$)表示特殊点的数量。

再下一行输入 $k$ 个整数 $a_1,a_2,\cdots,a_k$($1 \le a_i \le n$)表示特殊点。

保证所有数据 $n$ 之和以及 $m$ 之和不超过 $10^6$。

输出

每组数据输出一行,若存在符合要求的生成树则输出生成树的最小边权总和,否则输出 "Impossible"(不输出引号)。

做法 1

与普通的最小生成数相比,本题多了一个条件:一些点只能连一条边。那么,当 $n \ne 2$ 时,若有一条边的两点均为特殊点,则这条边不能选。先求出非特殊点的最小生成树,再加上特殊点即可。

备份