20250709 暑假集训 Day4
题目名称 动物园 策略游戏 儒略日 函数调用
输入/输出文件名 zoo.in/ans game.in/ans julian.in/ans call.in/ans
目录 zoo game julian call
提交源程序文件名 zoo.cpp game.cpp julian.cpp call.cpp
时间限制(ms) 1000 2000
空间限制(MB) 256 512 256
测试点数目 20 10 20
题目类型 传统题

注意事项

  1. 文件名(程序名和输入输出文件名)必须使用英文小写。
  2. C/C++ 中函数 main() 的返回值类型必须是 int,程序正常结束时的返回值必须是 0
  3. 提交的程序代码文件请放置在与CPP文件同名的文件夹内。
  4. 若无特殊说明,结果的比较方式为全文比较(过滤行末空格及文末回车)。
  5. 选手提交的程序源文件必须不大于 100KB。
  6. 程序可使用的栈空间内存限制与题目的内存限制一致。
  7. 只提供 Linux 格式附加样例文件。
  8. C++编译选项:‐O2 ‐std=c++14 ‐static

动物园

题目描述

动物园里饲养了很多动物,饲养员小 A 会根据饲养动物的情况,按照《饲养指南》购买不同种类的饲料,并将购买清单发给采购员小 B。

具体而言,动物世界里存在 2k2^k 种不同的动物,它们被编号为 02k10 \sim 2^k - 1。动物园里饲养了其中的 nn 种,其中第 ii 种动物的编号为 aia_i

《饲养指南》中共有 mm 条要求,第 jj 条要求形如“如果动物园中饲养着某种动物,满足其编号的二进制表示的第 pjp_j 位为 11,则必须购买第 qjq_j 种饲料”。其中饲料共有 cc 种,它们从 1c1 \sim c 编号。本题中我们将动物编号的二进制表示视为一个 kk 位 01 串,第 00 位是最低位,第 k1k - 1 位是最高位。

根据《饲养指南》,小 A 将会制定饲料清单交给小 B,由小 B 购买饲料。清单形如一个 cc0101 串,第 ii 位为 11 时,表示需要购买第 ii 种饲料;第 ii 位为 00 时,表示不需要购买第 ii 种饲料。 实际上根据购买到的饲料,动物园可能可以饲养更多的动物。更具体地,如果将当前未被饲养的编号为 xx 的动物加入动物园饲养后,饲料清单没有变化,那么我们认为动物园当前还能饲养编号为 xx 的动物。

现在小 B 想请你帮忙算算,动物园目前还能饲养多少种动物。

输入格式

第一行包含四个以空格分隔的整数 n,m,c,kn, m, c, k

分别表示动物园中动物数量、《饲养指南》要求数、饲料种数与动物编号的二进制表示位数。

第二行 nn 个以空格分隔的整数,其中第 ii 个整数表示 aia_i

接下来 mm 行,每行两个整数 pi,qip_i, q_i 表示一条要求。

数据保证所有 aia_i 互不相同,所有的 qiq_i 互不相同。

输出格式

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

输入输出样例 #1

输入 #1

3 3 5 4
1 4 6
0 3
2 4
2 5

输出 #1

13

输入输出样例 #2

输入 #2

2 2 4 3
1 2
1 3
2 4

输出 #2

2

输入输出样例 #3

输入 #3

见附件中的 zoo/zoo3.in

输出 #3

见附件中的 zoo/zoo3.ans

说明/提示

【样例 #1 解释】

动物园里饲养了编号为 1,4,61, 4, 6 的三种动物,《饲养指南》上的三条要求为:

  1. 若饲养的某种动物的编号的第 00 个二进制位为 11,则需购买第 33 种饲料。
  2. 若饲养的某种动物的编号的第 22 个二进制位为 11,则需购买第 44 种饲料。
  3. 若饲养的某种动物的编号的第 22 个二进制位为 11,则需购买第 55 种饲料。

饲料购买情况为:

  1. 编号为 11 的动物的第 00 个二进制位为 11,因此需要购买第 33 种饲料;
  2. 编号为 4,64, 6 的动物的第 22 个二进制位为 11,因此需要购买第 4,54, 5 种饲料。

由于在当前动物园中加入一种编号为 0,2,3,5,7,8,,150, 2, 3, 5, 7, 8, \ldots , 15 之一的动物,购物清单都不会改变,因此答案为 1313

【数据范围】

对于 20%20 \% 的数据,kn5k \le n \le 5m10m \le 10c10c \le 10,所有的 pip_i 互不相同。

对于 40%40 \% 的数据,n15n \le 15k20k \le 20m20m \le 20c20c \le 20

对于 60%60 \% 的数据,n30n \le 30k30k \le 30m1000m \le 1000

对于 100%100 \% 的数据,0n,m1060 \le n, m \le 10^60k640 \le k \le 641c1081 \le c \le 10^8

策略游戏

题目描述

小 L 和小 Q 在玩一个策略游戏。

有一个长度为 nn 的数组 AA 和一个长度为 mm 的数组 BB,在此基础上定义一个大小为 n×mn \times m 的矩阵 CC,满足 Cij=Ai×BjC_{i j} = A_i \times B_j。所有下标均从 11 开始。

游戏一共会进行 qq 轮,在每一轮游戏中,会事先给出 44 个参数 l1,r1,l2,r2l_1, r_1, l_2, r_2,满足 1l1r1n1 \le l_1 \le r_1 \le n1l2r2m1 \le l_2 \le r_2 \le m

游戏中,小 L 先选择一个 l1r1l_1 \sim r_1 之间的下标 xx,然后小 Q 选择一个 l2r2l_2 \sim r_2 之间的下标 yy。定义这一轮游戏中二人的得分是 CxyC_{x y}

小 L 的目标是使得这个得分尽可能大,小 Q 的目标是使得这个得分尽可能小。同时两人都是足够聪明的玩家,每次都会采用最优的策略。

请问:按照二人的最优策略,每轮游戏的得分分别是多少?

输入格式

第一行输入三个正整数 n,m,qn, m, q,分别表示数组 AA,数组 BB 的长度和游戏轮数。

第二行:nn 个整数,表示 AiA_i,分别表示数组 AA 的元素。

第三行:mm 个整数,表示 BiB_i,分别表示数组 BB 的元素。

接下来 qq 行,每行四个正整数,表示这一次游戏的 l1,r1,l2,r2l_1, r_1, l_2, r_2

输出格式

输出共 qq 行,每行一个整数,分别表示每一轮游戏中,小 L 和小 Q 在最优策略下的得分。

输入输出样例 #1

输入 #1

3 2 2
0 1 -2
-3 4
1 3 1 2
2 3 2 2

输出 #1

0
4

输入输出样例 #2

输入 #2

6 4 5
3 -1 -2 1 2 0
1 2 -1 -3
1 6 1 4
1 5 1 4
1 4 1 2
2 6 3 4
2 5 2 3

输出 #2

0
-2
3
2
-1

说明/提示

【样例解释 #1】

这组数据中,矩阵 CC 如下:

$$\begin{bmatrix} 0 & 0 \\ -3 & 4 \\ 6 & -8 \end{bmatrix} $$

在第一轮游戏中,无论小 L 选取的是 x=2x = 2 还是 x=3x = 3,小 Q 都有办法选择某个 yy 使得最终的得分为负数。因此小 L 选择 x=1x = 1 是最优的,因为这样得分一定为 00

而在第二轮游戏中,由于小 L 可以选 x=2x = 2,小 Q 只能选 y=2y = 2,如此得分为 44

【样例 #3】

见附件中的 game/game3.ingame/game3.ans

【样例 #4】

见附件中的 game/game4.ingame/game4.ans

【数据范围】

对于所有数据,1n,m,q1051 \le n, m, q \le {10}^5109Ai,Bi109-{10}^9 \le A_i, B_i \le {10}^9。对于每轮游戏而言,1l1r1n1 \le l_1 \le r_1 \le n1l2r2m1 \le l_2 \le r_2 \le m

测试点编号 n,m,qn, m, q \le 特殊条件
11 200200 1, 2
22 1
33 2
454 \sim 5
66 10001000 1, 2
787 \sim 8 1
9109 \sim 10 2
111211 \sim 12
1313 105{10}^5 1, 2
141514 \sim 15 1
161716 \sim 17 2
182018 \sim 20

其中,特殊性质 1 为:保证 Ai,Bi>0A_i, B_i > 0

特殊性质 2 为:保证对于每轮游戏而言,要么 l1=r1l_1 = r_1,要么 l2=r2l_2 = r_2

儒略日

题目描述

为了简便计算,天文学家们使用儒略日(Julian day)来表达时间。所谓儒略日,其定义为从公元前 4713 年 1 月 1 日正午 12 点到此后某一时刻间所经过的天数,不满一天者用小数表达。若利用这一天文学历法,则每一个时刻都将被均匀的映射到数轴上,从而得以很方便的计算它们的差值。

现在,给定一个不含小数部分的儒略日,请你帮忙计算出该儒略日(一定是某一天的中午 12 点)所对应的公历日期。

我们现行的公历为格里高利历(Gregorian calendar),它是在公元 1582 年由教皇格里高利十三世在原有的儒略历(Julian calendar)的基础上修改得到的(注:儒略历与儒略日并无直接关系)。具体而言,现行的公历日期按照以下规则计算:

  1. 公元 1582 年 10 月 15 日(含)以后:适用格里高利历,每年一月 3131 天、 二月 2828 天或 2929 天、三月 3131 天、四月 3030 天、五月 3131 天、六月 3030 天、七月 3131 天、八月 3131 天、九月 3030 天、十月 3131 天、十一月 3030 天、十二月 3131 天。其中,闰年的二月为 2929 天,平年为 2828 天。当年份是 400400 的倍数,或日期年份是 44 的倍数但不是 100100 的倍数时,该年为闰年。
  2. 公元 1582 年 10 月 5 日(含)至 10 月 14 日(含):不存在,这些日期被删除,该年 10 月 4 日之后为 10 月 15 日。
  3. 公元 1582 年 10 月 4 日(含)以前:适用儒略历,每月天数与格里高利历相同,但只要年份是 44 的倍数就是闰年。
  4. 尽管儒略历于公元前 45 年才开始实行,且初期经过若干次调整,但今天人类习惯于按照儒略历最终的规则反推一切 1582 年 10 月 4 日之前的时间。注意,公元零年并不存在,即公元前 1 年的下一年是公元 1 年。因此公元前 1 年、前 5 年、前 9 年、前 13 年……以此类推的年份应视为闰年。

输入格式

第一行一个整数 QQ,表示询问的组数。
接下来 QQ 行,每行一个非负整数 rir_i,表示一个儒略日。

输出格式

对于每一个儒略日 rir_i,输出一行表示日期的字符串 sis_i。共计 QQ 行。 sis_i 的格式如下:

  1. 若年份为公元后,输出格式为 Day Month Year。其中日(Day)、月(Month)、年(Year)均不含前导零,中间用一个空格隔开。例如:公元 2020 年 11 月 7 日正午 12 点,输出为 7 11 2020
  2. 若年份为公元前,输出格式为 Day Month Year BC。其中年(Year)输出该年份的数值,其余与公元后相同。例如:公元前 841 年 2 月 1 日正午 12 点,输出为 1 2 841 BC

输入输出样例 #1

输入 #1

3
10
100
1000

输出 #1

11 1 4713 BC
10 4 4713 BC
27 9 4711 BC

输入输出样例 #2

输入 #2

3
2000000
3000000
4000000

输出 #2

14 9 763
15 8 3501
12 7 6239

输入输出样例 #3

输入 #3

见附件中的 julian/julian3.in

输出 #3

见附件中的 julian/julian3.ans

说明/提示

【数据范围】

测试点编号 Q=Q = rir_i \le
11 10001000 365365
22 10410^4
33 10510^5
44 1000010000 3×1053\times 10^5
55 2.5×1062.5\times 10^6
66 10510^5
77 5×1065\times 10^6
88 10710^7
99 10910^9
1010 年份答案不超过 10910^9

函数调用

题目描述

函数是各种编程语言中一项重要的概念,借助函数,我们总可以将复杂的任务分解成一个个相对简单的子任务,直到细化为十分简单的基础操作,从而使代码的组织更加严密、更加有条理。然而,过多的函数调用也会导致额外的开销,影响程序的运行效率。

某数据库应用程序提供了若干函数用以维护数据。已知这些函数的功能可分为三类:

  1. 将数据中的指定元素加上一个值;
  2. 将数据中的每一个元素乘以一个相同值;
  3. 依次执行若干次函数调用,保证不会出现递归(即不会直接或间接地调用本身)。

在使用该数据库应用时,用户可一次性输入要调用的函数序列(一个函数可能被调用多次),在依次执行完序列中的函数后,系统中的数据被加以更新。某一天,小 A 在应用该数据库程序处理数据时遇到了困难:由于频繁而低效的函数调用,系统在执行操作时进入了无响应的状态,他只好强制结束了数据库程序。为了计算出正确数据,小 A 查阅了软件的文档,了解到每个函数的具体功能信息,现在他想请你根据这些信息帮他计算出更新后的数据应该是多少。

输入格式

第一行一个正整数 nn,表示数据的个数。
第二行 nn 个整数,第 ii 个整数表示下标为 ii 的数据的初始值为 aia_i
第三行一个正整数 mm,表示数据库应用程序提供的函数个数。函数从 1m1 \sim m 编号。
接下来 mm 行中,第 jj1jm1 \le j \le m)行的第一个整数为 TjT_j,表示 jj 号函数的类型:

  1. Tj=1T_j = 1,接下来两个整数 Pj,VjP_j, V_j 分别表示要执行加法的元素的下标及其增加的值;
  2. Tj=2T_j = 2,接下来一个整数 VjV_j 表示所有元素所乘的值;
  3. Tj=3T_j = 3,接下来一个正整数 CjC_j 表示 jj 号函数要调用的函数个数,
    随后 CjC_j 个整数 g1(j),g2(j),,gCj(j)g^{(j)}_1, g^{(j)}_2, \ldots , g^{(j)}_{C_j} 依次表示其所调用的函数的编号。

m+4m + 4 行一个正整数 QQ,表示输入的函数操作序列长度。
m+5m + 5QQ 个整数 fif_i,第 ii 个整数表示第 ii 个执行的函数的编号。

输出格式

一行 nn 个用空格隔开的整数,按照下标 1n1 \sim n 的顺序,分别输出在执行完输入的函数序列后,数据库中每一个元素的值。答案对 998244353\boldsymbol{998244353} 取模。

输入输出样例 #1

输入 #1

3
1 2 3
3
1 1 1
2 2
3 2 1 2
2
2 3

输出 #1

6 8 12

输入输出样例 #2

输入 #2

10
1 2 3 4 5 6 7 8 9 10
8
3 2 2 3
3 2 4 5
3 2 5 8
2 2
3 2 6 7
1 2 5
1 7 6
2 3
3
1 2 3

输出 #2

36 282 108 144 180 216 504 288 324 360

输入输出样例 #3

输入 #3

见附件中的 call/call3.in

输出 #3

见附件中的 call/call3.ans

说明/提示

【样例 #1 解释】

11 号函数功能为将 a1a_1 的值加一。22 号函数功能为所有元素乘 2233 号函数将先调用 11 号函数,再调用 22 号函数。

最终的函数序列先执行 22 号函数,所有元素的值变为 2,4,62, 4, 6

再执行 33 号函数时,先调用 11 号函数,所有元素的值变为 3,4,63, 4, 6。再调用 22 号函数,所有元素的值变为 6,8,126, 8, 12

【数据范围】

测试点编号 n,m,Qn, m, Q \le Cj\sum C_j 其他特殊限制
121 \sim 2 10001000 =m1= m - 1 函数调用关系构成一棵树
343 \sim 4 100\le 100
565 \sim 6 2000020000 40000\le 40000 不含第 22 类函数或不含第 11 类函数
77 =0= 0
898 \sim 9 =m1= m - 1 函数调用关系构成一棵树
101110 \sim 11 2×105\le 2 \times 10^5
121312 \sim 13 10510^5 不含第 22 类函数或不含第 11 类函数
1414 =0= 0
151615 \sim 16 =m1= m - 1 函数调用关系构成一棵树
171817 \sim 18 5×105\le 5 \times 10^5
192019 \sim 20 106\le 10^6

对于所有数据:0ai1040 \le a_i \le 10^4Tj{1,2,3}T_j \in \{1,2,3\}1Pjn1 \le P_j \le n0Vj1040 \le V_j \le 10^41gk(j)m1 \le g^{(j)}_k \le m1fim1 \le f_i \le m