试卷 全国信息学奥林匹克联赛(NOIP2019)复赛 提高组 day1
全国信息学奥林匹克联赛(NOIP2019)复赛 提高组 day1
全部题目
第 1 题    问答题

格雷码

【题目描述】

通常,人们习惯将所有n位二进制串按照字典序排列,例如所有2位二进制串按 字典序从小到大排列为:00, 01, 10, 11

格雷码(Gray Code)是一种特殊的n位二进制串排列法,它要求相邻的两个二进 制串间恰好有一位不同.特别地,第一个串与最后一个串也算作相邻。

所有2位二进制串按格雷码排列的一个例子为:00, 01, 11, 10。

n位格雷码不止一种,下面给出其中一种格雷码的生成算法:

1.1位格雷码由两个1位二进制串组成,顺序为:0, 1。

2.n + 1位格雷码的前2^n个二进制串,可以由依此算法生成的n位格雷码(总共 2^n个n位二进制串)按顺序排列,再在每个串前加一个前缀0构成。

3.n + 1位格雷码的后2^n个二进制串,可以由依此算法生成的n位格雷码(总共 2^n个n位二进制串)按逆序排列,再在每个串前加一个前缀1构成。

综上,n + 1位格雷码,由n位格雷码的2^n个二进制串按顺序排列再加前缀0,和 按逆序排列再加前缀1构成,共2^n+1个二进制串。另外,对于n位格雷码中的2^n个 二进制串,我们按上述算法得到的排列顺序将它们从0~2^n - 1编号。

按该算法,2位格雷码可以这样推出:

1.己知1位格雷码为0, 1

2.前两个格雷码为00, 01.后两个格雷码为11, 10。合并得到00, 01, 11, 10, 编号依次为0〜3。

同理,3位格雷码可以这样推出:

1.己知2位格雷码为:00, 01, 11 10。

2.前四个格雷码为:000, 001, 011.010。后四个格雷码为:110, 111, 101, 100。合并得到:000, 001. 011, 010, 110, 111. 101, 100,编号依次为 0 ~7。

现在给出n,k请你求出按上述算法生成的n位格雷码中的k号二进制串。

【输入格式】

从文件code.in中读入数据。

仅一行两个整数n,k意义见题目描述。

【输出格式】

输出到文件code.out中。

仅一行一个n位二进制串表示答案。

【样例1输入】

23

【样例1输出】

10

【样例1解释】

2位格雷码为:00, 01, 11. 10,编号从0〜3,因此3号串是10。

【样例2输入】

35

【样例2输出】

111

【样例2解释】

3 位格雷码为:000, 001. 011, 010, 110, 111. 101, 100,编号从 0 〜7,因此 5 号串是111。

【数据范围】

对于50%的数据:n≤ 10

对于80%的数据:k≤5x10^6

对于95%的数据:k≤  2^63 - 1

对于 100% 的数据:1 ≤ n ≤ 64,0 ≤ k≤2^n

第 2 题    问答题

括号树

【题目背景】

本题中合法括号串的定义如下:

1.0是合法括号串。

2.如果A是合法括号串,则(A)是合法括号串。

3.如果A, B是合法括号串,则AB是合法括号串。

本题中子串与不同的子串的定义如下:

1.字符串S的子串是S中连续的任意个字符组成的字符串。S的子串可用起始位置l与终止位置r来表示,记为S(l,r)(1≤l≤r≤|S|,|S|表示S的长度)。

2.S的两个子串视作不同当且仅当它们在S中的位置不同,即l不同或r不同。

【题目描述】

一个大小为n的树包含n个结点和n-1条边,每条边连接两个结点,且任意两个 结点间有且仅有一条简单路径互相可达。

小Q是一个充满好奇心的小朋友,有一天他在上学的路上碰见了一个大小为n的 树,树上结点从1~n编号,1号结点为树的根。除1号结点外,每个结点有一个父亲 结点,u (2≤ u≤n)号结点的父亲为fu (1 ≤ fu < u)号结点。

小Q发现这个树的每个结点上恰有一个括号,可能是'('或')'。小Q定义si为:将 根结点到i号结点的简单路径上的括号,按结点经过顺序依次排列组成的字符串。

显然si是个括号串,但不一定是合法括号串,因此现在小Q想对所有的i(1≤i≤n) 求岀,si中有多少个互不相同的子串是合法括号串。

这个问题难倒了小Q,他只好向你求助。设si共有ki个不同子串是合法括号串, 你只需要告诉小Q所有ixki的异或和,即:

(1 x k1) xor (2 x k2) xor (3 x k3)xor .…xor (n x kn)其中xor是位异或运算。

【输入格式】

从文件brackets.in中读入数据。

第一行一个整数n,表示树的大小。

第二行一个长为n的由'('与')'组成的括号串,第i个括号表示i号结点上的括号。 

第三行包含n-1个整数,第i(1≤i<n)个整数表示i+1号结点的父亲编号fi+1。

【输出格式】

输出到文件brackets.out中。

 仅一行一个整数表示答案。

【样例1输入】

5

(()()

1 1 2 2

【样例1输出】

6

【样例1解释】

树的形态如下图:

将根到1号结点的简单路径上的括号,按经过顺序排列所组成的字符串为(,子串 是合法括号串的个数为0。

将根到2号结点的简单路径上的括号,按经过顺序排列所组成的字符串为((,子 串是合法括号串的个数为0。

将根到3号结点的简单路径上的括号,按经过顺序排列所组成的字符串为(),子 串是合法括号串的个数为1。

将根到4号结点的简单路径上的括号,按经过顺序排列所组成的字符串为(((,子 串是合法括号串的个数为0。

将根到5号结点的简单路径上的括号,按经过顺序排列所组成的字符串为((),子 串是合法括号串的个数为1。

【数据范围】

第 3 题    问答题

树上的数

【题目描述】

给定一个大小为n的树,它共有n个结点与n-1条边,结点从1~n编号。初始 时每个结点上都有一个1~n的数字,且每个1~n的数字都只在恰好一个结点上出现。

接下来你需要进行恰好n-1次删边操作,每次操作你需要选一条未被删去的边, 此时这条边所连接的两个结点上的数字将会交换.然后这条边将被删去。

n-1次操作过后,所有的边都将被删去。此时,按数字从小到大的顺序,将数字 1~n所在的结点编号依次排列,就得到一个结点编号的排列Pi。现在请你求出,在最 优操作方案下能得到的字典序最小的Pi。

如上图,蓝圈中的数字1〜5 一开始分别在结点②、①、③、⑤、④。按照⑴⑷(3)⑵ 的顺序删去所有边,树变为下图。按数字顺序得到的结点编号排列为 ①③④②⑤,该 排列是所有可能的结果中字典序最小的。

【输入格式】

从文件tree.in中读入数据。

本题输入包含多组测试数据。

第一行一个正整数T,表示数据组数。

对于每组测试数据:

第一行一个整数n,表示树的大小。

第二行n个整数,第i (1≤i≤ n)个整数表示数字i初始时所在的结点编号。 接下来n-1行每行两个整数x,y,表示一条连接x号结点与y号结点的边。

【输出格式】

输出到文件tree.out中。

对于每组测试数据,输出一行共n个用空格隔开的整数,表示最优操作方案下所 能得到的字典序最小的Pi。

【样例1输入】

4  

5

2 1 3 5 4

1 3

1 4

2 4

4 5

5

3 4 2 1 5

1 2

2 3

3 4

4 5

5

1 2 5 3 4

1 2

1 3

1 4

1 5

10

1 2 3 4 5 7 8 9 10 6

1 2

1 3

1 4

1 5

5 6

6 7

7 8

8 9

9 10

【样例1输出】

1 3 4 2 5

1  3 5 2 4

2  3 1 4 5 

2 3 4 5 6 1 7 8 9 10

【数据范围】

对于所有测试点:1 ≤ T ≤ 10,保证给出的是一个树。

答题卡
全部题目
1 2 3
题目总数:3
总分数:100
时间:不限时
QQ
公众号
客服
扫一扫