5月到6月遇到一些好玩的题
好久没有写博客了,抽空写写最近遇到一些好玩的题目
- 碰撞攻击:http://120.78.128.11/Problem.jsp?pid=3311 比较适合做BSGS的入门题,题解就写在题目上,讲解通过碰撞方式,使得一些暴力算法的枚举量从O(n),下降到O(sqrt(n))方法。
- 麻婆豆腐:https://www.nowcoder.com/acm/contest/128/B 一道忽悠人的概率论题,一个集合异或和为1的概率p无论是多少,只要这个集合再加入一个0.5概率为1的。则为1概率就是(p*0.5)+(1-p)*0.5=0.5. 所以就是求有多少个集合包含0.5
- 01序列2:https://www.nowcoder.com/acm/contest/114/D 想错一步维护半年,刚开始像一般写法一样,维护区间左右端点,发现要维护9到10个变量,合并操作太复杂了,写到明年都DEBUG不完。赛后发现维护区间的3种前缀和数量就行,多少对前缀和模3同余,就有多少个子区间是3的倍数。再注意判掉直接3的倍数的前缀和就行了
- 托米的简单表示法:https://www.nowcoder.com/acm/contest/111/A 大模拟,用到一点容斥思想。难点在于计算一对匹配的括号的高度,正常写法是要从内往外逐一计算高度,但是细节貌似有点多。不过有种暴力写法,首先每次遇到左括号深度加1,右括号深度减一。然后针对深度建立一棵查询区间最大值的线段树,则一对括号高度=(自己的深度-自己所管区间的深度的最大值)+1。
- AB序列:https://www.nowcoder.com/acm/contest/113/B 这题稍微要一点脑洞,题意是求一个x使得
最小。我们转换一下式子
而对于这种老掉牙的模型的解就是Ci的中位数。为啥? 你算一下当x从ci变化到ci+1时,函数值的增量就知道了,然后可以发现只有中位数的变化量为0,也就是导数为0啦
- 操作数:https://www.nowcoder.com/acm/contest/109/C 题意求序列a的K阶前缀和,也是老掉牙的题目了,好像FZUOJ上有道一模一样的题。 这题关键在于计算ai为 Sk,j贡献系数wi,k,j。怎么算呢,令ai=1,其他数都为0。然后模拟一下得到了,如果你数学好的话,一眼就知道这系数就是组合数,看不出的话,你打个表找下规律也知道这wi,k,j是个组合数了。
- 贝壳找房移山: https://nanti.jisuanke.com/t/27295 这题比较神奇,首先你按题目的描述把山峰画出来,把山峰翻转朝下,然后对每个高度做切片得到一个序列,并对这序列做缩点:将连续的区间,合并为一个点,然后你会发现你得到了一颗树 ORZ.而你要做的是,删除最少的结点使得这颗树叶子数下降到k以内(每次操作只能删叶子)。然后只要每次贪心删掉权和最小的分支就行了。因为根据轻重链剖分,要选择最少的分支,使得树结点最多,其实就是保留尽量长的一个树链,所以要的删的话肯定是把所有树链按权和从小到大排序,再逐一删除,然后你发现其实就是就是贪心删除最小树链,
样例1:
- 等价串:https://www.nowcoder.com/acm/contest/134/F 这题比较有意思,这题关键是在于发现所有操作是可逆的(通过组合其他操作),所以具有对称传递性,即若A能变成B,则可以通过可逆操作使得B变成A。遇到这情况的一般做法,是大家同一变化到一个标准表示(范式)。例如对于循环字符串来说标准表示就是最小表示法。而这题的标准表示可以用:把所有的1全部用00替代,然后尽可能的删除000即可。