2023 年上海市大学生程序设计竞赛 - 一月赛 题解

komorebi edited 2 年,2 月前

A

By lbromine

签到题,如果朋友回答的不是No,则把两个名字都用 map 打上标记。

最后再枚举一遍所有朋友,如果没有标记就 ans++

B

By Amuzi

注意到5+8=13

首先考虑n13的倍数的情况,即n=13×k。因此总的解题思路是:先把113的数重新排列,再每连续13个数分成一组,把n分成k组,最后使用鸽笼原理求解答案。

先思考第一个问题,把113的数重新排列,使任意2个相邻的数差为58

这个问题只能逐步尝试,从1开始尝试不难得到:16113813510271249就是满足题目要求的一个排列。

再思考第二个问题,每连续13个数为1组,每个组都按步骤1的方法排序,任意一个组中最多取出多少个数,使任意两个数的差不是5也不是8

这个问题比较简单,注意到每组第1个数和第13个数差为8,且任意相邻2个数都不满足条件,故最多是隔一个数取一个,且第一个数和最后一个数不同时取,因此每个组最多取出6个数。

综合上述几个问题,考虑原题目的答案。把这k组当作鸽笼,根据鸽笼原理,对任意k×6+1个数来说,定有一个组中至少有7个数。结合步骤2的结论可得:对1n=13×k中的任意k×6+1个数,一定有2个数的差是58。因此本题的答案不大于k×6,下面将构造出k×6个数满足条件:

按照在步骤1的规律,第1组取1245811,第2组取141517182124,以此类推,第k组取13k1213k1113k913k813k513k2。则取出的k×6个数满足题目要求。

然后考虑n不为13倍数并且大于13的情况,易发现最优取法与成倍数时并无区别。

最后考虑n小于13的情况,答案易知。

C

By Komorebi

把正确的阵法里的#和目前的阵法里的#连边,代价为他们之间的欧氏距离,就是一个带权二分图最优匹配的问题,套KM算法即可。

可以涉及到一些优化,例如.较少时用.进行连边。

时间复杂度 O(T×n6) ,优化后常数可以很小。

D

By Amuzi

观察到P1>P2>P3。这是个典型的枪手博弈,不难想到,Komorebi会先攻击Amuzi再攻击lbromine,而其他两个人都会先攻击Komorebi

那么弄清楚攻击顺序之后,就是个简单的状压DP。用个二维dp数组表示下第n轮各种情况的概率。然后按照对应概率直接暴力转移即可。

当然,还有一些分类讨论的做法,本质其实是一样的。

Note

这个简单的状压DP显然可以用矩阵快速幂优化。矩阵大小是6×6的。也就是说n可以开到1e9及更高,那么有一些比较纯粹的讨论就会被卡掉。

E

By Komorebi

我们把x,y,k看作常数,令

F[n]=i=0nkxnk×iyiCn(k1)×ii

通过打表或推导会发现这个式子等价于

F[n]=xF[n1]+yF[nk]

对于n<k的部分暴力求,n>k的部分可以套矩阵快速幂求解。

对于k=1的情况再矩阵快速幂过程中需要小心处理,或者直接拎出来特判。

时间复杂度 O(k3×log n)

F

By lbromine

题意可抽象为给定一颗 n 个节点的树,有边权,q 次询问,每次询问一个区间 [l,r]

min[ dis(u,v) | u,v[l,r],uv ]

如果只有一个区间,则可以考虑点分治

每个点在点分树上最多有 log n 个祖先,于是可以把每个点在点分树上的所有祖先和该点到它的的距离预处理出来。然后枚举[l,r]的所有点,对于每个点更新他所有祖先到[l,r]的最小和次小距离。最后枚举所有祖先,对最小距离与次小距离之和求最小值即可得到答案。

对于 q 次询问,可以将询问离线,使用回滚莫队即可解决。

时间复杂度 O((q+n)nlogn)

Past Versions

Comments