CodeForces Educational Codeforces Round 59 题解

菜了菜了……后三题居然考场上毫无思路……%爆HYX

A:Digits Sequence Dividing (1107A)

乍一看是一道很难的题目,DP啊什么的……实际上只要把第一个数字单独拿出来,如果后面是两位数以上,那一定比一位数要大,满足条件;如果后面只剩一个数字,只要比较一下大小就好了。

B:Digital root (1107B)

有一个前置知识(找规律也可发现),就是一个数字在按照题目那么操作直到剩下最后一个数字,那么这个数字就是原数字模9的余数……

有了这个知识,就能知道答案就是9的(k-1)倍数加上x了。

C:Brutality(1107C)

既然连打k个会炸,就只要考虑连续k个以上的段里面留下k个最大的就好了,用一个堆,从左到右扫一遍,发现这一段结束了就从堆里拿完或者拿k个,加到答案上就OK了。

D:Compression(1107D)

观察发现,就是要把原来的矩阵划分成若干完全相同的小块。因为要划分,所以无论横竖,对于一段连续相同的长度来说,最终答案一定是这段长度的因数。所以只要暴力找出所有的连续的长度,求一个最大公约数就是答案了。

E:Vasya and Binary String(1107E)

很明显是DP题,不过这个DP比较骚(或者我太菜了看不出来QwQ)。

首先预处理出一个g[i]数组表示连续i个相同数字消掉的最优答案。f[i][j][k]表示从第i个到第j个全部弄完,前面(包括第i个)和第i个一样的有连续k个数字的答案,那么转移就是,可以把第一个单独列出去和前k个一起消掉,就是g[k]+f[i+1][j][1];也可以枚举一个l,当第l个数字等于第i个数字的时候,先把i+1到l-1消掉,然后把第l个和第i个凑到一起,看看接下来怎么搞,就是f[i+1][l-1][1]+f[l][j][k+1],转移的时候只要取最大的方案就可以了,最后答案就是f[1][n][1],这样效率是O(n^4)的。

F:Vasya and Endless Credits(1107F)

待补……据说是二分图最大权匹配。

G:Vasya and Maximum Profit(1107G)

这题我知道两种写法。

两种写法都需要的预处理是对a-c[i]做一个前缀和,假设为s[i],那么答案就是s[r]-s[l-1]-max(gap)。

一种是用笛卡尔树,利用笛卡尔树确定每一个gap能够影响到的范围,在这个范围内用RMQ找到最小的s[l-1]和最大的s[r],算出答案,对每个gap都找到这么一个答案,最大的就是答案了,笛卡尔树部分效率O(n),RMQ部分效率O(nlogn)

另一种是用线段树,考虑枚举右端点,那么需要找到的就是最小的左端点,再考虑gap的影响,他每次能影响到的范围就是到前面第一个比他大的gap为止。因此,我们使用一个单调栈来维护gap,每次找到gap要更新的范围和需要更新的差值,加到前缀和的序列上面,全部操作完之后,找到前面的最小值就可以了,总效率O(nlogn)

### 关于Codeforces Educational Round 171 #### A. The Contest 题目描述指出,在决定举办一场比赛之后,参赛者需要准备一系列材料,包括但不限于问题陈述、解决方案等。然而,协调员可能会突然要求更改某些测试案例的形式[^1]。 对于A题《The Contest》,时间限制为每组测试2秒,内存限制为256兆字节。输入来自标准输入流,输出至标准输出流[^3]。此题目的核心在于处理多组测试数据的情况,这通常意味着程序应当能够高效读取并解析多个独立的测试实例,并分别给出解答。 #### 输入格式说明 根据以往的比赛经验,输入的第一行可能包含两个整数`n`和`m`(1 ≤ n, m ≤ 5·10^5),表示用户的数量以及朋友关系集合的数量[^2]。不过需要注意的是,具体到Educational Round 171中的实际数值范围和其他细节会有所不同,请参照官方发布的最新信息为准。 #### 示例代码实现(Python) 下面是一个简单的模板用于解决涉及多组测试的数据结构化编程挑战: ```python def solve_problem(input_data): results = [] t = int(input()) # 获取总的测试次数t for _ in range(t): # 解析每一组测试的具体参数 params = list(map(int, input().split())) result = process(params) # 假设process函数实现了具体的逻辑运算 results.append(result) return "\n".join(str(x) for x in results) if __name__ == "__main__": from sys import stdin, stdout print(solve_problem(stdin)) ``` 该脚本展示了如何接收多轮次的标准输入并将它们作为单独的任务来执行,最后统一输出所有的计算结果。请注意调整`params`变量的内容以适应特定问题的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值