2024 GXCPC游记 & 个人部分题解

· · 个人记录

第一次参加线下的ACM比赛。。。有点紧张,平常时也只是在洛谷或者saikr参加线上的ACM比赛。

我只是一个今年寒假才开始学习算法的萌新,截止到5.19,刚刚好连续打卡洛谷100天(。意外地拿到了银奖。

日记

5.17

从崇左坐动车到桂林,坐了三个小时半。刚下动车,桂林开始下雨了,然后我们先去酒店登记住下,再去吃点东西,今天就过去了。

5.18

今天要去签到,看了下时间,可以睡到中午qwq(懒狗)再过去签到,签完之后有一个测试赛。今天依然是下雨。

我们在副赛点(一共两个赛点,主赛点是桂林电子科技大学,副赛点是广西师范大学),进到广师范里,觉得非常大,有一种 “这TM才叫大学” 的感觉(因为本人学校是某个破二本)。

里边还有广西应用数学中心、音乐学院、美术学院,之前还觉得,如果考研考双非的话意义不大,但是现在看来双非也不一定差,总之是很喜欢这个学校。

我们的赛点在应用数学中心那边,到那边签到,然后领了队服和挂牌。

然后是开幕式。因为我们是副场,所以是远程连线的形式(我们副场到底食不食仁啊!)

开幕式结束之后,14.00就开始测试赛了,一共四道题,只解了一道签到题~另外三道交了两道,一道WA,一道MLE。orz,这个时候已经预见到明天的惨败了。

好消息:会写dfs

坏消息:只会dfs

晚上去吃了火锅,一个138的套餐居然够四个人吃,吃的饱饱的。明天要早起了,所以今晚就睡早点。

5.19

今天是比赛日,刚起床的时候就因为昨晚吃的火锅太辣蹲了好久厕所,肚子out。吃完酒店提供的早餐就准备赶过去了。今天的雨比前两天的还大,听说昨晚南宁还内涝了hhhhh。

做到赛位上,看了眼墙壁,一共有13个气球,意味着有A~M个问题,心想着,13个问题我总不会一个都解不出来吧!努力拿下铜奖吧!

最后是解了五道题,有一道题是封榜的时候解的所以没有气球。

没想到评奖的时候意外地挤到了银奖的位置。按道理这个解题数量应该是铜奖,运气好,脑子跟上了出题人的节奏,搞了几个简单题,罚时也少~。题目结构是签到+简单题+普通题+困难题,显然我完成了签到+简单题的部分,普通题有一题想到了但是没时间调代码了。

题目集下载:待补充

官方题解:待补充

我的银牌:还没寄过来

接下来看看蒟蒻的部分个人题解吧。

蒟蒻的部分题解

按问题字母大小排序,仅包含Po主思考过或已经通过的题。

B. Black Friday

给定 n 个物品,每个物品原价 p_i,打折价 q_i。若打折力度达到 k=\frac{a}{b} 那就可以购买这个物品,问可以购买的最多物品的总价。

数据范围:n(1 \le n \le 10^4),a,b(1 \le a \le b \le 10^4),p_i,q_i(1 \le q_i \le p_i \le 10^4)。

思路

签到题没啥好说的,折扣比较的话,直接化成相同分母,比较分子就行了,全程用整数避免浮点误差。

D. Dune

现在有一条数轴,你站在 x 的位置,现在有 n 条虫子,每条虫子覆盖的区间为 [l_i, r_i],并且每条虫子有速度 v_i / 秒。你可以选择一个时刻 t 召唤虫子,你召唤到的虫子长度等于那个时间点覆盖到点 x 的长度最短的虫子,问你能召唤到的最长的虫子长度。

数据范围:n(1 \le n \le 10^5),x(0 \le x \le 10^9),l_i,r_i(-10^9 \le l_i \le r_i \le 10^9),

v_i(1 \le v_i \le 10^9)

思路

这题没做但是思考了一下,感觉是考虑到虫的位置具有单调性,也就是它经过 t 个单位时间后位置一定是单调递增的,应该是要弄出每条虫覆盖 x 的时间点,然后再解决其他子问题。

E. Epsilon Estuary

玩家拥有一个全屏攻击的武器,伤害固定为 y。拥有 n 个怪物,第 i 个怪物有 x_i 血。每次受到攻击,假设剩余 x 血量,则怪物分裂成 \lceil \frac{x}{2} \rceil 和 \lfloor \frac{x}{2} \rfloor 两个新的怪物,问多少回合干掉这些怪物,一共 T 组询问。

数据范围: T(1 \le T \le 10^5),n(1 \le n \le 10^5),y(1 \le y \le 10^{18}),x_i(1 \le x_i \le 10^{18})

思路

发现玩家的攻击是全体的,所以只需要关心血量最多的那只怪物就行了,然后模拟攻击的过程就行。数据较大要开longlong。

F. Farewell GXCPC!

给定 n 个题目,每个题目有难度 dif_i,有趣值 fun_i。再给一些询问 q,每个询问 l_i,r_i 代表在所有题目中,难度值范围在 [l, r] 之间并且有趣值最大,若没有符合要求的难度值组合输出 -1 。

数据范围: n(1 \le n \le 5000),q(1 \le q \le 10^{5}),l_i,r_i(1 \le l_i \le r_i \le 5000)

思路

显然的背包问题。维护一个布尔数组 vis 用于标记是否出现过某个组合,初始化 vis_0 为 true,到后面要做背包的时候,如果某个 vis_i 上一状态为 true,那么当前状态就可以标记 vis_{i + dif_i} 为 true,代表可以有这个组合。动态转移方程为 dp[i + dif_i] = max(dp[i + dif_i], dp[i] + fun_i) 。 dp 使用滚动数组优化空间。此处复杂度 5000^2 大约 2 * 10^7 + 5 * 10^6 可接受。

对于每个查询遍历 vis 从 [l, r] ,若 vis_i 为 true 更新答案 ans = max(ans, dp[i]) 最后输出即可。此部分复杂度与上一部分一样,加起来不超过 10^8 ,常数也不大,可以接受。

J. Judge System with Random

有一个评测系统,赛时提交包括提交者自己看不到任何反馈。反馈结果只有 accept/reject 。一个选手的最终罚时等于*第一次ac之前的提交数 20 + 第一次ac的时间**。现在有两个选手 A,B ,他们分别提交了 n,m 次,第 i 次提交的时间分别是 x_i,y_i。每次比赛结束会产生胜利者。

成为胜利者的条件要求胜利者所有提交记录中至少有一次是ac,并且罚时最小。如果有多个选手罚时最小则可以拥有多个胜利者。

问在所有可能的 2^{n + m} 种情况中, A 成为胜利者的情况有多少种?

数据范围:n,m(1 \le n,m \le 10^5),x_i(1 \le .... \le x_{i - 1} \le x_i \le x_{i + 1} .... \le 10^9),y_i(1 \le .... \le y_{i - 1} \le y_i \le y_{i + 1} .... \le 10^9)

思路

经过观察,选手的总罚时只需要关注第一次ac的时间就行了,并且罚时是递增的,有单调性,可二分。

因为如果要成为胜利者,至少要有一次ac,所以枚举 A 的所有提交,并判断假设 A 在第 i 个提交中ac了, B 有多少种情况罚时 \ge A 的。比如枚举到第 i 个时间点并假设 A 在这个时间点获得了第一次ac,对于 [1, i- 1] 这些位置是确定的,只能填 reject,而 i 这个位置只能填 accept。然后使用二分找到 B 中第一个罚时 \ge A 的点 j。对于 B 也是同样的道理,[1, j - 1] 是 reject ,j 是 accept。去除确定的部分,那么有变的部分就是后面的了,A 的情况就有 k=1*2^{n - i} ,B 的情况就有 l=1*2^{m-j} 种。

那么答案就是 \sum{k}{l} 了。

K. Kingdom Rush: Vengeance

给定 n 个防御塔和 m 个敌人。每个防御塔的防御范围是 [l_i, r_i],伤害是 w_i,若有多个防御塔重叠在同一个点,那造成的伤害是他们的总和。敌人的出生点在 0.5 + x_i ,有 h_i 的血量,每个时刻结束后会固定向前移动 1 个距离。

问对于每个敌人,如果防御塔能杀死他,他会在第几个时间点死去,否则杀不死的,输出 -1。

数据范围:n,m(1 \le n,m \le 10^5) ,l_i,r_i,w_i(1 \le l_i \le r_i \le 1^9, 1\le w_i \le 10^4),x_i,h_i (0 \le x_i \le 10^9, 1\le h_i \le 10^{18})

思路

这题完整的解题思路已经想到了,但是没有时间敲出来了。

对于所有防御塔管辖的范围区间做区间合并,把所有区间弄成不重叠的区间。然后做一个伤害前缀和,先简单判断一下第 i 个敌人会不会死,不会的话直接 -1。

否则使用二分查找敌人会死掉的那个区间,再在区间里再进行一次二分,找到具体死亡的时间点输出即可。

L. Loong

给定一个 x(1 \le x \le 9999) 问 x 年的下一个龙年是几几年

思路

签到题~小于8的输出8就行,否则模拟年轮,从8开始一直加12直到大于 x。