komorebi edited 2 年,2 月前
A
By lbromine
签到题,如果朋友回答的不是No
,则把两个名字都用 打上标记。
最后再枚举一遍所有朋友,如果没有标记就 。
B
By Amuzi
注意到。
首先考虑为的倍数的情况,即。因此总的解题思路是:先把到的数重新排列,再每连续个数分成一组,把分成组,最后使用鸽笼原理求解答案。
先思考第一个问题,把到的数重新排列,使任意个相邻的数差为或。
这个问题只能逐步尝试,从开始尝试不难得到:就是满足题目要求的一个排列。
再思考第二个问题,每连续个数为组,每个组都按步骤的方法排序,任意一个组中最多取出多少个数,使任意两个数的差不是也不是?
这个问题比较简单,注意到每组第个数和第个数差为,且任意相邻个数都不满足条件,故最多是隔一个数取一个,且第一个数和最后一个数不同时取,因此每个组最多取出个数。
综合上述几个问题,考虑原题目的答案。把这组当作鸽笼,根据鸽笼原理,对任意个数来说,定有一个组中至少有个数。结合步骤2的结论可得:对到中的任意个数,一定有个数的差是或。因此本题的答案不大于,下面将构造出个数满足条件:
按照在步骤1的规律,第组取,第组取,以此类推,第组取。则取出的个数满足题目要求。
然后考虑不为倍数并且大于的情况,易发现最优取法与成倍数时并无区别。
最后考虑小于的情况,答案易知。
C
By Komorebi
把正确的阵法里的#
和目前的阵法里的#
连边,代价为他们之间的欧氏距离,就是一个带权二分图最优匹配的问题,套KM算法即可。
可以涉及到一些优化,例如.
较少时用.
进行连边。
时间复杂度 ,优化后常数可以很小。
D
By Amuzi
观察到。这是个典型的枪手博弈,不难想到,Komorebi
会先攻击Amuzi
再攻击lbromine
,而其他两个人都会先攻击Komorebi
。
那么弄清楚攻击顺序之后,就是个简单的状压。用个二维数组表示下第轮各种情况的概率。然后按照对应概率直接暴力转移即可。
当然,还有一些分类讨论的做法,本质其实是一样的。
Note
这个简单的状压显然可以用矩阵快速幂优化。矩阵大小是的。也就是说可以开到及更高,那么有一些比较纯粹的讨论就会被卡掉。
E
By Komorebi
我们把看作常数,令
通过打表或推导会发现这个式子等价于
对于的部分暴力求,的部分可以套矩阵快速幂求解。
对于的情况再矩阵快速幂过程中需要小心处理,或者直接拎出来特判。
时间复杂度
F
By lbromine
题意可抽象为给定一颗 个节点的树,有边权, 次询问,每次询问一个区间
求
如果只有一个区间,则可以考虑点分治
每个点在点分树上最多有 个祖先,于是可以把每个点在点分树上的所有祖先和该点到它的的距离预处理出来。然后枚举的所有点,对于每个点更新他所有祖先到的最小和次小距离。最后枚举所有祖先,对最小距离与次小距离之和求最小值即可得到答案。
对于 次询问,可以将询问离线,使用回滚莫队即可解决。
时间复杂度