听说这一轮是TCO的备用题,所以潘达教主悲剧地不能参加了。戴牛展现出了惊人的实力,勇夺第八,rating暴涨。250pt是一个很水的贪心题,500pt是一个有一些trick的暴力题,但是由于一些细节的原因,比赛的时候没有做出来。
以下是详细的报告:
250pt: 给定一个string,包括一串未匹配的括号对(),问要将这些括号匹配至少需要添加多少个括号。括号匹配类问题里最简单的一个问题了。假设在某个位置出现了一个右括号’)’而之前没有足够的左括号,则需要在它之前添加一个左括号,位置不限。假设以上条件满足,在串结束的时候发现左括号数比右括号数多(包括添加的左括号),则需要补全相应的右括号。算法就是基于以上两条原则进行贪心,用left和right变量来统计当前的左括号数和右括号数,视情况添加括号即可。
500pt: 在平面上有最多40个点,现在用一个大小范围在nlow和nhigh之间正方形去选取这些点,每一次选取可以不同的点集。问一共有多少个这样的点集。点坐标的范围-10e8到10e8,nlow和nhigh的范围1到10e8。这一题比较阴险的一个地方在于,如果要枚举所有的点集,那么一共会有2^40个不同的点集,而函数的返回值也暗示了这一点,而事实上可能的组合大约只有(2n)^2种,这一点可以由一维的情况推广而知。假设在一维的轴上有若干个点,用一个矩形去选取不同的点的集合,我们发现,能选取到的只有连续的点集,推广到二维上亦是如此。将所有的点离散化后,我们得到一个N*N的矩阵,我们枚举这些矩阵,使其满足边长大于等于nlow并且小于等于nhigh、且可以构成正方形。将这样的正方形能选取的点集存入一个set,最后只需要统计set内元素的个数即可了。算法的复杂度O(40^4)。
1000pt: 用1*2的砖块堆一个烟囱,每一层用四块砖,每块砖必须放在两块砖的结合处之上。问要砌一个n (n<10e18)的烟囱,有多少种不同的砌砖顺序。枚举每一层可能出现的砖块排列情况作为dp的状态,手算推出状态间转移的方程,得到一个O(N)的算法。然后用矩阵乘的性质,对这个算法进行加速,类似于快速幂乘法的原理。具体的推算过程请见官方editorial: