A
220713-数组与堆
时间限制:1000ms 内存限制:65536kb
题目描述
在各类实现堆的代码中,通常选择使用一维数组去模拟堆的结构。如果在堆构建好之后,将这个一维数组输出,可以观察到他们有一些有趣的性质。我们将小根堆(最小堆)构建完成后所对应的数列,称为小根堆数列,大根堆(最大堆)构建完成后所对应的数列称为大根堆数列。
堆是最重要的数据结构之一,堆的类型有2种:最大堆和最小堆。对于最大堆,父结点的键值总是大于或等于任何一个子节点的键值。对于最小堆,父结点的键值总是小于或等于任何一个子节点的键值。通常堆的实现是用一维数组完成的。
给定一个长度为 n 的一维数组,请判断该一维数组是否实现了最大堆或者最小堆。如果该一维数组实现了最大堆,请输出Max heap
;如果该一维数组实现了最小堆,请输出Min heap
;如果该一维数组既没实现最大堆,也没实现最小堆,请输出Not a heap!
。
输入格式
第一行是一个正整数 T,表示数据组数。
接下来有 T 组数据:每组数据包含2行,其中第1行为正整数 n,表示一维数组的长度;第2行为 n 个正整数(每个正整数之间用空格隔开),表示该一维数组。
输出格式
对于每一组数据,输出Max heap
,Min heap
或者Not a heap!
,每个一行。
输入样例
3
6
1 2 6 5 7 13
3
5 2 1
9
3 1 4 1 5 9 2 6 5
输出样例
Min heap
Max heap
Not a heap!
数据范围
T≤20
2≤n≤100000
数据保证不会有一维数组,既实现最大堆,又实现最小堆。
B
220713-通讯录
时间限制:1000ms 内存限制:204800kb
题目描述
小明同学有一个通讯录,通讯录中有 n 条记录。对于每一条记录,分别有对方的姓名和电话号码。假设通讯录中所有的姓名都不重复,请你帮小明同学写一个程序,以姓名为输入,查询该姓名对应的电话号码。
输入
第一行为两个整数 n 和 m,其中 n 表示通讯录中记录的数量,m 表示查询的数量。
接下来的 n 行,每行2个字符串 name 和 number,其中 name 表示姓名,number 表示 name 对应的电话号码。字符串 name 和字符串 number 均不含空格。
之后出现的 m 行,每行1个字符串 query,表示需要查询的姓名。
输出
对于每一次需要查询的姓名,输出对应的电话号码。如果通讯录中没有改姓名,则输出Not Found
。
输入样例
2 3
alice 1234567
bob 7654321
alice
bob
catherine
输出样例
1234567
7654321
Not Found
数据范围
1≤n≤500000。
1≤m≤10000。
query 的每一位是26个小写英文字母(即a到z)之一,且字符串 name 和字符串 query 的长度不超过20。
字符串 number 的每一位是10个阿拉伯数字(即0到9)之一,且字符串 number 的长度不超过 20。
C
220713-数据位置
时间限制:1000ms 内存限制:65536kb
题目描述
给定整数 t 和一个整数数组data
,查找 t 在数组data
中第1次出现的位置。
输入
第1行,一个正整数 n(n≤1000000)。
第2行,n 个int
型整数(可能有重复的数),这 n 个int
型整数组成了数组data
。
第3行,多个int
型整数(可能有重复的数,但总数不超过1000000个),其中第
i
i
i 个数记为
t
i
t_i
ti。输入的数之间用空白符号(空格、换行、或制表符)分隔。
输出
对每一个int
型整数
t
i
t_i
ti,若其出现在数组data
中,则输出其第一次出现在数组data
的位置(出现在data
中第几个输入的数);否则(即其未出现在数组data
中),输出NO
。每一个输出占一行。
输入样例1
5
1 2 3 4 5
4 5 6 7 1
输出样例1
4
5
NO
NO
1
输入样例2
9
1 2 3 4 5 5 5 5 1
4 5 5 5 1
输出样例2
4
5
5
5
1
D
220713-是否互通
时间限制:1000ms 内存限制:65536kb
题目描述
给定图 G,G 包含 n 个顶点。
现在有两种操作:
第一种:在两个顶点间添加一条边(该边是双向的,且不保证两个顶点间只会有一条相连的边)。
第二种:询问两个顶点之间是否存互通的路径。
输入
第一行2个数,顶点个数 n (2≤n≤100000),操作个数 m (1≤m≤1000000)。
接下来 m 行,每行3个整数,分别为:操作种类 op(op=1为添加新边操作,op=2为询问操作),第一个顶点编号 u (1≤u≤n),第二个顶点编号 v (1≤v≤n)。(保证 u 和 v 不相等)
输出
对于每次询问操作(op=2时),输出一行,YES表示互通,NO表示不互通。
输入样例
3 3
2 1 2
1 1 2
2 1 2
输出样例
NO
YES
E
220713-二进序列
时间限制:1000ms 内存限制:65536kb
题目描述
给定一个二进制数(该二进制数的长度可能非常长),可以对该二进制数进行以下4种操作:
(1)操作+
:将该二进制数加1;
(2)操作-
:将该二进制数减1;
(3)操作*
:将该二进制数乘2;
(4)操作/
:将该二进制数整除2;
给定一个二进制数以及包含多个操作的操作序列,求经过运算后的二进制数。
输入格式
输入包含3行:
第一行包含2个正整数n和m:n表示输入的二进制数的长度,m表示输入的操作序列所包含操作的个数。
第二行为1个字符串,用来表示输入的二进制数。该字符串的长度为n,且该字符串的每一个字符是0
或者1
。保证输入的二进制数不包含前导零。
第三行为1个字符串,用来表示输入的操作序列。该字符串的长度为mm,且该字符串的每一个字符为+
、-
、*
、/
种的其中之一。保证运算过程不会出现负数。
输出格式
输出仅包含1行:一个字符序列,表示经过运算后的二进制数(不包含前导零);如果运算结果为0,则输出0即可。
样例输入1
4 10
1101
*/-*-*-/*/
样例输出1
10110
样例输入2
5 4
10010
+//-
样例输出2
11
样例输入3
3 14
101
+**++***++
样例输出3
10010
数据范围
1≤n,m≤5×104。
F
220713-核酸队伍
时间限制:1000ms 内存限制:65536kb
题目描述
有 N 名学生在排队做核酸,被编队为 1、2、3…N,每名学生的身高都为整数。
当且仅当两名学生中间的学生身高都比他们矮时,两名学生方可看到对方。
现在,我们只知道最高的学生的身高是 H ,剩余学生的身高未知。
但是,我们还知道这群学生之中存在着 M 对关系,每对关系都指明了某两名学生 A 和 B 可以相互看见。
求每名学生的身高的最大可能值是多少。
输入格式
第一行输入整数 N,H,M,数据用空格隔开。
接下来 M 行,每行两个整数 A 和 B ,代表学生 A 和学生 B 可以相互看见,数据用空格隔开。
输出格式
一共输出 N 行数据,每行输出一个整数。
第 i i i 行输出的整数代表第 i i i 名学生可能的最大身高。
输入样例
9 185 5
1 3
5 3
4 3
3 7
9 8
输出样例
185
184
185
183
184
184
185
185
185
数据范围
1≤N≤5000
1≤H≤1000000
0≤M≤10000
HINT
题目给出的关系对可能存在重复
G
220713-神奇2的幂
时间限制:1000ms 内存限制:65536kb
题目描述
任意一个正整数n都可以表达成若干个2的幂相加。例如,整数9有以下10种不同的与加数排序无关的表达方式:
(1) 9=1+1+1+1+1+1+1+1+1
(2) 9=2+1+1+1+1+1+1+1
(3) 9=2+2+1+1+1+1+1
(4) 9=2+2+2+1+1+1
(5) 9=2+2+2+2+1
(6) 9=4+1+1+1+1+1
(7) 9=4+2+1+1+1
(8) 9=4+2+2+1
(9) 9=4+4+1
(10) 9=8+1
注意:在本题中,9=8+1
和9=1+8
被认为是相同的与加数排序无关的表达方式。因为它们的加数均为8和1,仅加数的顺序不同。
输入
输入仅1行:一个正整数n。
输出
输出仅1行:正整数n的与加数排序无关的表达方式的个数(由于输出的数值可能会非常大,因此输出的数值需要对1000007取模)。
输入样例
9
输出样例
10
数据范围
1≤n≤5000000。
H
220713-蓄水池
时间限制:1000ms 内存限制:65536kb
题目描述
一个蓄水池由多个不同高度的平台构成。给定一个n行m列的二维矩阵,表示该蓄水池由n×m个平台构成,同时也表明了每个平台的坐标位置。将此二维矩阵中第i行第j列的数字记为 h i j h_i^j hij ,表示处在第i行第j列的平台的高度。
在该蓄水池中,所有平台之间形成的空间凹陷区域可以用于储存水,求该蓄水池总共可以储存的水量。
输入
第一行,2个正整数n, m,分别表示蓄水池所对应的二维矩阵的行数和列数。
接下来n行,每行m个非负整数,表示该行所包含的平台的高度。
输出
一行,仅包含1个非负整数,表示该蓄水池总共可以储存的水量。
输入样例
5 5
0 1 1 1 1
1 0 3 3 2
0 3 0 0 2
2 3 0 0 3
1 2 3 3 2
输出样例
9
数据范围
1≤n,m≤200
0≤
h
i
j
h_i^j
hij≤2×104
提示
储存满水后的矩阵如下:
0 1 1 1 1
1 1 3 3 2
0 3 2 2 2
2 3 2 2 3
1 2 3 3 2
I
220713-数字塔
时间限制:1000ms 内存限制:65536kb
题目描述
给定2n−1个数,可以按照以下方式构建一个数字塔:这2n−1个数排列在数字塔的最后一层;每上一层的数的个数减2,同时该层每个位置的数的值是它正下方三个数的中位数。下图给出了一个数字塔:
数字塔最顶层的数为该数字塔的代表数。给定一个数字塔最后一层的2n−1个数,求出该数字塔的代表数。
输入格式
输入包括2行:
第一行仅一个整数n(n的含义如上述所示)。
第二行包含2n−1个整数,表示数字塔最后一层的数。
输出格式
输出仅包含一行:该数字塔的代表数。
输入样例
4
1 6 3 7 4 5 2
输出样例
4
数据范围
所有数据在int范围之内,且 2≤n≤100000。
J
220713-最大化求和
时间限制:1000ms 内存限制:65536kb
题目描述
给定一个长度为n数列 A=a1,a2,…,ai,…,an,其中,1≤ i i i≤n≤2000000,−50000≤ a i a_i ai≤50000。
当给定两个整数x和y(1≤x≤y≤n),A[x:y]表示数列A从下标x到下标y的子段;同时,sum(x,y)表示子段A[x:y]中所有元素的和(即sum(x,y)= ∑ i = x y a i \sum\limits_{i=x}^{y}a_i i=x∑yai)。
给定两个关于数列A的子段:A[x1:y1]和A[x2:y2],当x1≤y1<x2≤y2或者x2≤y2<x1≤y1时,则A[x1:y1]和A[x2:y2]这两个子段是不相交的。
现在给定一个正整数m,请找到数列A的m个互相不相交的子段(A[x1:y1], A[x2:y2], …, A[xk:yk], …, A[xm:ym]),使得 ∑ k = 1 m s u m ( x k , y k ) \sum\limits_{k=1}^{m}sum(x_k,y_k) k=1∑msum(xk,yk)的值最大。
输入
输入包含2行:
第1行为2个整数m和n(m和n的含义如上述所示);
第2行为n个整数,a1, a2, …, an,用来表示数列A。
输出
输出仅1行: ∑ k = 1 m s u m ( x k , y k ) \sum\limits_{k=1}^{m}sum(x_k,y_k) k=1∑msum(xk,yk)的最大值。
输入样例
3 8
-1 -2 10 -3 7 -4 5 -9 3
输出样例
22