近三年的题做的人相对地多了,所以网上的题解就比较好找了。所以例举的题都是个人觉得比较经典有意思的。
特别是我感觉近两年的轮数和难度都增加了,有些题看解答都有些吃力,所以浏览地很慢。不过确实整体质量很高,几乎没有怪题,不会卡常数空间或时间。
2017
Round A
Problem B. Patterns Overlap:
字符串匹配的“升级版”——一个*字符可以匹配0-4个字符,所以转移条件需要好好考虑。
题解:https://blog.csdn.net/ihsin/article/details/73729482
Problem C. Space Cubes:
三维空间中有一些平行于坐标系的球体,求边长最短的两个正方体能把它们全都包进来。当然不能一部分球体在一个正方体中。
很明显,若是一个正方体会好写很多,所以难点就在于两个。看了别人的代码,是真滴秀,用最简单清晰的思路解决了这个问题。
对于每个球体,因为其平行于坐标系,所以我们只需要关注6个点。基于这个事实:其中一个正方体一定处于8个极端方位的一个。比如说x<0,y<0,z<0这个方位,我们就要找到6*N个点中在x,y,z三维的最小值。那么它就是正方体的一个顶点。因此通过二分固定边长,我们可以枚举一个正方体的8个情况,然后通过那些没有被包裹的球体的6个点,我们可以计算出x或y或z三个方向上最大的差距,看它是否大于边长来检查合法性。
Round B
Problem B. Center
这道题的代码强推。看了网上的题解很懵,因为我觉得这种数学转化常人应该都不知道才对。。。
果然,看了人家现场AC的代码,着实又被秀到。
我们知道二分用来找单调曲线,三分用来找有一个极值的函数曲线。所以在二维平面上,我们知道y= |
x | 是可以用三分解决的。那么现在是三维空间了,可以大胆推测,它变成了一个有唯一最小值的面,就像一个倒立的锥形。因此,通过两次三分我们就能解决这个问题了。 |
Problem C. Christmas Tree
无处不在的DP,值得思考一下。状态的表示有助于转移条件的编写。
Round C
Problem D. The 4M Corporation
给定最小值,最大值,中位数和平均数,创建一个个数最少的合法序列,其中从左到右非递减。
有一个点睛之笔。分个数有奇偶两种情况考虑会清晰很多。其中特殊情况我就不详述了。
奇数个:我们直接就得到三个确定元素:最小值,最大值,中位数。这时候我们计算这三个数的平均数并和期望平均数进行比较。如果小了(大的情况解决思路一样),那我们需要尽快补上。因为我们只考虑奇数个的情况,所以我们要放2个。其中中位数左边放和中位数一样大的,中位数右边放最大值,然后我们就能计算出最少需要放几次就能补上了。
偶数个:变化就是中位数由两个数确定了,但其余思路类似。
Round E
Problem A. Copy & Paste
从这开始每题都有英文的官方解析。这题我是照题解思路写的Code。
其中一个点是选择复制操作下一步可以令它一定是粘贴操作而不会产生错误。
Round F
此博客有这一轮的所有题解:https://www.cnblogs.com/zhixingr/p/8116514.html
Problem C. Catch Them All
其中第三题是少见的矩阵快速幂,值得一做。
Round G
三题都很有质量,且官方解析清楚详细。若是和我一样对于第三题的具体实现方式还是存疑,可以看看https://blog.csdn.net/ihsin/article/details/82055146。
2018(开始取消题号)
Round A
Scrambled Words
把我头都秀没的一题——压缩时间的方法在于一个关键点的观察及其推导。同时map查找的复杂度应该只能到lgN的复杂度。所以需要用到unordered_map,也就是我们一般所说的哈希,而map的实现是红黑树,当然map的优势在于key是有序的。当然关键是需要手写一个hash函数。真 第一次碰到这种情况,果然是题海无涯。
Round B
Sherlock and the Bit Strings
也是通过一个数据范围的宽松来作为切入点。只能说DP的变化几乎就是无穷无尽的。这篇博客很NB:https://blog.csdn.net/Dylan_Frank/article/details/88018079
King’s Circle
当遇到一个没见过,但是肯定有结论的问题,能不能以最快的速度、最简洁的形式将它猜出来。这个实现方法不错,两个树状数组:https://blog.csdn.net/lemonmillie/article/details/93263368
Round D
Candies
C++的内置数据结构真的超有用。set除了用来判重之外,它底层的实现会自动的将数据进行排序。因此,在这道题上使用set就不需要手写平衡二叉树了。附上优秀Code:https://www.cnblogs.com/wangyiming/p/9873586.html
Funniest Word Search
DP“天花板”,遇到就GG:https://blog.csdn.net/lemonmillie/article/details/94497249
Round E
Milk Tea
官方解法不如这篇博客直观:https://www.cnblogs.com/wa007/p/9538352.html
Round F
Palindromic Sequence
略显复杂的一道递推,虽然博客写了一大堆,但没官方思路清晰(主要是没看懂。。),不过代码写得不错:https://blog.csdn.net/lemonmillie/article/details/95203060
Round G
Cave Escape
小范围的参数和可以不考虑相互顺序性的问题基本就是DP:https://blog.csdn.net/lemonmillie/article/details/95126996
2019
Round A
Contention
妥妥的难题。看看大佬二分+贪心的“奇思妙想”:https://www.cnblogs.com/Patt/p/11618433.html
Round B
Diverse Subarray
区间修改+单点查询的线段树,但是通过类似于前缀后的思路来想到真的有点难。。。(这道题我看了很多Code发觉都比刘汝佳的蓝书给出的代码简略——没有下沉操作。想了好久,才看出来这题查询的最大值永远是1-n区间的最大值,所以区间修改只会影响上层结点,而这个在递归修改操作返回前就可以更新了。)
Round C
其实三题质量都很高,但难度适中,思路相对容易想到,没有那种woc的感觉。
Round D
Food Stalls
也是一个关键的Observation使得原问题能够迅速转换为熟悉的集合维护问题。https://blog.csdn.net/liufengwei1/article/details/97615790
Round E
Street Checkers
题本身不是很难,但是需要考虑的比较细致:https://blog.csdn.net/lemonmillie/article/details/100066807
Round F
本轮三题题解:https://www.jianshu.com/p/5558be58b1ea
Flattening
如果你精通DP,那你就已经赢了一半。这道22分的题对于我来说难度和40分题差不多。
Spectating Villages
典型的树形DP。
Round H
本轮题解:https://www.jianshu.com/p/248f4c71accf
Elevanagram
我觉得思维量巨大的一题,但Scoreboard上居然有将近100人做出来。。。。
给你若干个0~9的数字,每个数字的数量为Ai, i∈[0,9]。让你排列这些数字,使其按a+b-c+d-e+…这样的加减交替得出的最终解为11的倍数。比如说8174958就满足:8 - 1 + 7 - 4 + 9 - 5 + 8 = 22,22是11的倍数。
小数据的DP思路很容易接受,但题解Code处有一个细节就是某个数字的数量最多考虑20/21个,但其实看了官方解析和其它思路后我觉得最多考虑10/11个就够了,且提交也是正确的,为什么呢?
比如说我们有10个1,和其它的一些数字达成了要求(加减得到的结果是11的倍数)。那么1的情况只有11种(左边代表正的1的个数,右边代表负的1的个数):
- 0 - 10 = -10, -10 % 11 = 1;
- 1 - 9 = -8, -8 % 11 = 3;
- 2 - 8 = -6, -6 % 11 = 5;
- …, -4 % 11 = 7;
- …, -2 % 11 = 9;
- …, 0 % 11 = 0;
- …, 2 % 11 = 2;
- …, 4 % 11 = 4;
- …, 6 % 11 = 6;
- …, 8 % 11 = 8;
- …, 10 % 11 = 10;
发现了什么,11种情况涵盖了模11后的所有可能余数。不只是1,其它的2-9都是如此。我相信你肯定见过这样的数学规律。所以当我们拥有某个数字的数量为10/11可以达成条件时,多余的数字并不能为我们创造更多的可能性。