2021“MINIEYE杯”中国大学生算法设计超级联赛(9)
军训时期抓紧补。
直到上课一周才补完,大学生活真的太忙了/ll
[1001 NJU emulator]
solution
题面:维护一个栈,有八种操作:加入一个
做法:
注意到我们还没使用减法,如果我们处理了
而处理到
所以一定不要相信样例的构造!
1 | //2021.9.9 by ljz |
[1002 Just another board game]
solution
题面:给你一个
做法:从两方立场分别贪心来看,总共移动的次数是不超过
1 | //2021.9.3 by ljz |
[1003 Dota2 Pro Circuit]
solution
题面:每个人初始有
做法:最高和最低差不多,就提一下最高好了。冷静一下,发现一种比较合理的贪心方式,就是算第
1 | //2021.8.17 by ljz |
[1004 Into the woods]
solution
题面:每次可以向上下左右等概率地走一步,一共要走
做法:我们如果按照期望的定义,即权值乘概率,会发现这题真的不容易做出。
换一种思路,发现可以改写成
这要求一条路径要跨出所限制的斜正方形区域,这不好,我们再改写成
这样就是要求一条路径不能碰到斜正方形的边界了,可惜这依旧不容易。
二维随机游走有种经典的转化,就是令
这就是我们从
这也是经典问题,重新转成二维,
经典的对称 + 容斥,具体做法可以参考以下( 是我以前写的 ):
带范围限制的一维随机游走转为二维随机游走,即转化为
从
开始,向右走转为 ,向左走转为 ,那么 的限制就是 ,也即 ,最终位置为 。 这是一个经典问题,二维向右或向上游走,不接触两条直线,问方案数。
比较好的想法就是容斥,设两条直线分别为
,我们只讨论终点在直线间的情况,在直线的一侧是容易的。 我们知道
到 的方案数是 。但无疑直接计算会使得触碰直线的情况被算入,于是我们减去这些情况。 考虑将一个触碰直线的情况写成类似
的模式,并将其压缩,即将连续且一致的经过合并成一个,于是上述情况可以改写成 。 我们想分别计算出开头为
与开头为 的方案数,两者类似,先考虑前者。 考虑将终点沿
翻转,假设为 。那么每一条路径到 都必然经过 。同时,将最后一次经过 的点到 的路径再次沿 翻转,这一条路径只能是以 或 结尾的。 但这是结尾,我们需要求的是开头,思考不合法情况有什么,发现是类似
之类的。 我们将
沿 翻转,类似上述地,可以知道这样求出的路径是以 结尾的。这样多减去了 的情况。 可以得出一般性的结论,每一次沿直线
翻转,就等价于将上一次的每一种情况的开头加了 。 于是反复翻转,即可容斥出答案。
而这道题的终点不固定,于是就要枚举终点。
于是答案就是
再冷静一下,这东西很容易就优化掉了。
冷静一下,
1 | //2021.9.11 by ljz |
[1005 Did I miss the lethal?]
solution
题面:每张牌能造成
做法:以弃的牌的数量不同分类,分为 map
换成
1 | //2021.9.7 by ljz |
[1006 Guess the weight]
solution
题面:
做法:当我们对数
首先能发现这个分界点可以二分。那么我们只需要维护上述信息,发现线段树是完全可以胜任的。维护值域,需要维护的信息有每个数的出现次数,比这个数大的个数,以及小的个数。修改操作就是两个区间修改和一个单点修改,分界点直接二分,那么总时间复杂度就是
可惜这个过不了,冷静一下发现这个分界点是中位数,所以可以直接在线段树上二分,就是
实现时我偷懒直接用了 pair
,所以常数比较大。
1 | //2021.9.4 by ljz |
[1007 Boring data structure problem]
solution
题面:第
做法:只要用个 list
就可以维护所有信息了,具体细节直接看代码。
1 | //2021.9.2 by ljz |
[1008 Integers Have Friends 2.0]
solution
题面:找出一个最长的子序列,使得每个数模
做法:注意到一件事,当模
两个数在最后的答案中的概率是
1 | //2021.9.3 by ljz |
[1009 Little prince and the garden of roses]
solution
题面:
做法:对于某一种颜色
这是容易证明的,考虑类似匈牙利的过程,若当前无颜色可用了,可逼迫当前染色边染成该颜色,然后将另一条有该颜色的边退流,容易构造出方案。容易证明这样的复杂度是
所以不能跟榜啊。
代码不是很想写了。
1 | //2021.9.16 by ljz |
[1010 Unfair contest]
solution
题面:有两个人在跳水比赛,他们的最终成绩为去掉最大的
做法:冷静一下,最大的
坑:
1 | //2021.8.17 by ljz |
[1011 ZYB’s kingdom]
solution
题面:一棵树,每个点有一个值
做法:先理解下题意,等价于每次去掉那
考虑一种暴力的做法。用
于是我们考虑一种新的做法,即维护一棵类似虚树的结构,将这
这样的复杂度还是错的,毕竟是暴力跳父亲。不过没啥关系,一般的暴力跳父亲都可以重链剖分一次,来优化这个复杂度。这题也毫不例外,于是暴力直接修改的点只有重儿子和那些特殊点,那么暴力跳就只用跳到重链链顶。时间复杂度
1 | //2021.9.15 by ljz |