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)

你可能感兴趣的:(题解)