破解密码
from:Starzxy
这都是vfk出的QAQ你萌别打我
算法一
暴力枚举每一位的字母,判段Hash值是否相等,时间复杂度
算法二
用高斯消元消元就好啦,时间复杂度
算法三
对于每一个
我为什么用了算法三只有50分?
刚刚最后一句话在逗你,有除法的地方一定要考虑没有逆元的情况!(别怪我们坑人……样例里就有
对于刚刚推出来的
所以对于这种情况要特判一下,把
时间复杂度
智商锁
from:jiry_2
大家好这里是冒充Picks的JRY,其实嘛大家看到题目和生成树有关就应该猜到是我出的了?(雾)
预告和实际出题人不符其实也是有着很深的缘由...粗略来讲大致就是:本来Picks出了一道很有趣B给UR#6,然后发了预告开始写程序造数据的时候发现这题比原来想象的要难多了...一开始我们本着"即使出成UHR也不换题"的良好心态硬着头皮闷声造Round,但是昨天大家突然感觉这样似乎不大好?于是VFK就把毒瘤题推到以后再和大家见面,我们匆匆忙忙又重新造了一道B,因为时间仓促这道B比较简单,就当给大家送分辣。(注:UHR即UOJ Hard Round)
算法一
随便画一下就可以发现,
算法二
求无向图的生成树个数是一个经典问题,可以直接用基尔霍夫矩阵解决,这样时间复杂度是
当然如果不会基尔霍夫矩阵也没关系,
算法三
接下来三个测试数据告诉了我们输入,一道构造题硬生生变成了题答题 ,所以我们就可以用解决构造题的思想来求解这三个测试数据:寻找输入的特殊性。
大家都应该知道,
第六个点的数都比较大,看起来就像是挺难找到规律的样子。但是我们观察出题人(其实是VFK)给部分分的风格:既然环这种简单无脑的思路都给了20分了,完全图没有理由不给20分啊!于是我们把
至于第七个点,我们跑一下分解质因数就可以发现所有数都可以表示成若干个小质数的乘积。而在算法一中我们已经知道了怎么在
算法四
接下来我们来考虑一种合理的构造方法,直接构造是比较困难的,因为我们现在只能对答案进行乘法(见第七个点)而无法进行加法。于是我们就可以开始尝试乱搞。
标程的做法是:随机1000张点数为12的无向图,用基尔霍夫矩阵求出第
这个做法相当于自行对最终的图添加了一个比较严苛的条件进行求解,为什么这样是靠谱的呢?接下来提供一种对正确性大致的解释(以下是数学渣JRY在没有任何道理的情况进行的口胡):
首先我们随机无向图的方法是每一条边生成的概率都是0.8,而12个点的完全图的生成树个数是
接下来我们要求的是
而且实际上,我也用电脑跑过 。
总结
总而言之,这道题作为B还是比较简单的,送的部分分多的都不像是我出的题了(雾)。另外,大家以后见到Picks那题时候可以脑补一下,这场UR在没有换题之前是怎样鬼畜的画风。
最后感谢业界良心的策爷对出题的帮助。
懒癌
from:jiry_2
大家好这里居然还是JRY,之前也是在UOJ上出了几道题,不过好像因为宣传上出现了一点偏差,给人留下了一种我只会出生成树的感觉?所以是时候来一道题扭转画风辣!
这道题的一开始来自于一道某城市的小升初数学题...那道题是二十个人每个人一只狗,每个人可以看到别人的狗但不能看自己的狗,有一天至少有一只狗生病了,每天上午每一个人可以去看一遍别人的狗,下午同时开枪。已知第二天开枪,问有几只生病的狗。
那个时候看到这题也是觉得挺有意思的,然后随手改成n个人第k天开枪问有几只生病的狗给VFK看看能不能当A> <然后被跳蚤国王一眼识破:“这真的不是原题吗。”之后我们花了很长时间来研究这个问题的各种变形,最后出出来这道题,感觉还是挺有趣的。
那也不扯下去了,切入正题来讲一下题解。
算法一
感觉最水的还是完全图的十分?现在,假设伏特跳蚤国王是狗主人之一,然后以他的视角来模拟这个流程。
如果第一天,伏特跳蚤国王走出家门一看:“咦,别人家的狗都没生病?”好那一定是自己的狗病了,“砰”。
如果第二天,伏特跳蚤国王走出家门一看:“咦,我只看到了一只生病的狗?”然后他靠着他超高逼格的智商开始分析:如果我的狗没有生病,那么昨天这只病狗的狗主人应该没有看到任何一只生病的狗,那昨天就应该有枪声!好一定是我的狗病了,“砰”。
以此类推。
所以我们知道,如果有
期望得分:10分
算法二
上一个算法也还是挺有启发性的,我们发现我们在分析自己的狗有没有生病的时候的方法是:假设我没有生病,然后看前一天是否应该发出枪声。而这个方法对任意图都适用的。
考虑状压DP,令
所以我们就知道怎么DP了!对于一个状态,我们枚举这个状态中每只生病的狗的狗主人,那么这个状态的开枪时间应该是这些生病的狗主人中开枪时间的最小值,从中我们也可以知道有多少人同时开枪。
那么一个狗主人会枚举哪些可能的生病情况呢:首先对于所有他看到的狗,他枚举的生病情况一定是和当前情况相同的,其次他自己一定是没有生病的,而至于哪些他看不到的狗,他就只好枚举这些狗的生病状况了。
最后,如果有限时间内不会开枪怎么办?事实上是存在这种情况的,但是没关系,如果我们发现转移出现了环,所以这个环中的所有状态都是在有限时间内不会开枪的。
时间复杂度似乎是O(
算法三
有了算法二,我们可以把表打出来看看,然后就可以发现一个小小的规律:对于生病状态
所以拥有超高逼格智商的伏特跳蚤国王就可以只枚举一种生病情况:首先对于所有他看到的狗,他枚举的生病情况一定是和当前情况相同的,其次他自己一定是没有生病的,而至于哪些他看不到的狗,由刚才的规律,可以全部当成生病的。
所以时间复杂度就可以降到O(
算法四
为了取得更多的分,我们需要一个多项式算法。我们重新来考虑有限时间内开枪的条件:转移无环。实际上这是一个很强的条件。
考虑根据转移建一个新图,如果
那么我们先把所有可以到达大小大于
首先这张图上有一些点被染黑了,黑点表示这只狗有病,白点表示这只狗没病。接着每一时刻,我们可以把一个黑点染白,然后把这个点连向的点的集合的一个子集染黑。若干轮之后,所有点都变白了。假设有
看起来这个转化比较意识流,但是如果我们考虑怎么DP所有操作方案中最大的
而在这个模型下,算法三的小规律就很显然辣!增加黑点对答案的贡献一定非负。所以问题又变成了:
一个DAG上有一些点被染黑了,接着每一时刻,我们可以把一个黑点染白,然后把这个点连向的点全部染黑。若干轮之后,所有点都变白了。假设有
这不就是求DAG上一个点集能直接或者间接到达的点数吗?
所以我们把判断一个生病状态在第几天开枪转化为了求DAG上一个集合能直接或间接到达的点数。这样第一问已经非常简单了。考虑算每一个点的贡献,如果一个点能被
接下来考虑第二问,一个人要在DAG上满足什么样的条件才会在第一天开枪呢?在原来的DP中,我们是在取
所以我们脑补一下可以得到:如果一个点第一个反转,且之后得到的状态无论怎么操作都无法再把这个点染黑,那么这个点对应着一个最早开枪的狗主人。
所以第二问也可以很简单的解决了,还是考虑算每一个点的贡献,如果一个点能被
因为计算DAG中每一个点可以被多少点到达是O(
算法五
最后的技术含量就很低辣,这个问题显然是可以压位的嘛,所以可以把时间复杂度搞到O(
什么,你说这个复杂度过不了
好吧其实真相是本来数据范围我们放的是 然后我们发现
VFK:今夜,我们都是Sereja
总之,如果有人因为
总结
最后让我们来看看这道C到底是什么东西:
给定一个DAG,对所有的
这题居然是UR的C!妈妈这次UR的画风不对。还有比我更良心的UR出题人吗
!
最后这道题还有一个我们没有解决的EX版本大家做完这题可以想一想:
把最开始给的条件“至少一只生病的狗”改成“至少