2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解

A. 寻找字符串

对于一个字符串 s,定义一个函数 S(x),表示 s 中有多少个子串 x。现在给定 S(a),S(b),S(ab),S(ba)的值,求满足这 4 个值的字符串 s,如果有多个满足条件的字符串,输出字典序最小的。
s 中仅可能含有字符 a 和 b。

任何一个串的 S(ab) 与 S(ba) 的相差都不会超过1。可以分 S(ab)-S(ba) 为 0 -1 1 三种情况讨论。先构造出相应的 ab 相邻的串,再考虑按照字典序最小出要求将剩余的字母插入串中即可。
应该注意,这道问题有很多需要特判的情况。具体如何可以查看数据。

时间复杂度 O(S(a)+S(b))

B. 幸运数字

定义幸运数字为数位(十进制)只含有 4 和 7 的数字。例如:4,7,47,777 等是幸运数字;5,72 等就不是幸运数字。
定义函数 next(n)表示大于等于 n 的最小的幸运数字,现在给你一个区间[a, b]让你求 S(a,b)=next(a)+next(a+1)+….+next(b-1)+next(b)的值。

由于幸运数字不多,可以预处理出来。计算查询范围内的幸运数字是多少个数字的 next,即可通过本题。

时间复杂度: O(29)

C. 恩爱的回文数

因为最近身边脱单的人太多了,于是 GBX 狂热的迷上了回文数。因为回文数看起来就像是一对恩爱狗站在一起,他希望自己将来也有那么一天(虽然并不可能)。这一天他突然想到一个问题,长度不大于 n 的自然数中有多少是回文数?因为数据很大,所以最后的结果请对 1000000007 取模。

O(n) 枚举位即可通过本题。

D. 最强单身狗

有若干只单身狗排成一排,编号从 l 到 r。GBX 发现,一个单身狗的编号的二进制中 1 的数量越多,表示该单身狗越强(就是单身越久咯 -_-|||)。GBX 想找到一只最强的单身狗和他做朋友(强者惺惺相惜吧 >_<)。
如果有多个输出最小的那个。

1 必然放在低位更好,于是判断 l | (l+1) 是否在 [l, r] 内,如果是的话,输出 l = l | (l+1), 否则当前的 l 就是所求答案。

时间复杂度 O(log(r))

E. 卡莉斯塔

Kalista 有一个技能叫撕裂,当该技能冷却完毕后,Kalista 进行普通攻击时会给目标增加一层可无限叠加的 debuff。Kalista 可以释放撕裂技能来引爆目标身上的 debuff(目标身上没有 debuff 时,无法撕裂),技能会造成基础伤害 a,每层 debuff 会增加 b 点伤害。Kalista 每次普通攻击会造成 x 点伤害,撕裂技能的冷却时间为 y(从技能开始释放的瞬间开始计算冷却)。
现在有一个敌人拥有 m 点生命值。那么 Kalista 最快需要多少秒时间能杀死该敌人(生命值小于等于 0 时,敌人死亡)?假定 Kalista 每秒可以普通攻击一次或者使用一次技能,不能在同一秒中使用技能并进行普通攻击;并且假设现在技能已经冷却完毕。

先计算出全部使用普通攻击的击杀时间,之后仅考虑使用技能的情况。
任何一个攻击序列,将最后释放的技能移动到最后,总伤害不会减少,于是可以假设最后一次一定是技能攻击。再次前提下,可以看做每次伤害都是 x+b。释放技能的伤害是 a 但代价是后面 y 回合伤害减少 b。这种模型下,使用技能占有优势或者劣势,分情况讨论即可得到最短击杀时间。

时间复杂度: O(1)

F. 梦回三国

。。。。【背景略】
赤壁之战结束之后魏蜀吴三国决定握手求和,但是因为之前四处交战,把道路全部毁坏了,现在需要重新修路使得三国的国都能够连通.诸葛亮是这个项目的负责人,但是他太聪明了,对于这种题目都懒得思考了,于是就交给你了。
同一时间只能有一条道路在修建中,求最少用时。

结果容易发现是 min(d(u,A)+d(u,B)+d(u,C)) d(u,v) 表示 u 到 v 的最短路。于是可以计算三次单源最短路,枚举 u 得到结果。

时间复杂度: O(nlog(n)+m)

G. FQ 的函数

FQ(k,p) 定义为: k!可被 pFQ(k,p) 整除,但是不能被 pFQ(k,p)+1 整除。
ZQ 对 FQ 的发现很感兴趣,但是他对 FQ 在这个函数的讨论中仅使用十进制表示不满。ZQ于是定义了ZQ(n,p)。其中n 是个p进制正整数,并且 ZQ(n,p)=FQ(n10,p) 。其中 n10 表示 n 转换成十进制之后对应的数字。
本题的任务就是求出 ZQ(n,p)的值。注意:请将答案表示为十进制数。

注意 n 是 p 进制数字,进行除以 p 的操作意味着舍弃最低位。
例如 n=(a1a2a3a4)p 那么所求结果就是 (a1a2a3)p+(a1a2)p+(a1)p
可以预处理 1+p+p2+...+pi ,即可 O(log(n)) 通过本题。

H. 数组反转

有一天,FQ 在玩一个游戏。
FQ 有个数组 a[1…k],一开始 a[i] = i (1 ≤ i ≤ k)。然后 FQ 不断的对这个数组进行操作,每次的操作都是把这个数组的一个区间反转。
举例来说 FQ 一开始有 a[1…5] = {1, 2, 3, 4, 5}。然后他将 a[2..4]反转,数组就变成了 a[1…5] = {1, 4, 3, 2, 5};再将 a[2..5] 反转,就得到了 a[1…5] = {1, 5, 2, 3, 4}。
FQ 总共对这个数组进行了 n 次操作,并把操作记录了下来。这个时候 ZQ 出场了,ZQ 找到了 FQ 的记录,但是由于天气原因,FQ 的记录不全——ZQ 得到的记录是 FQ 全部记录下的操作序列的一个子串。ZQ 就只得认为他得到的序列是 FQ 的全部操作。那么在 ZQ 看来,FQ 的序列最终是什么样子的呢?

可以预处理出初经过 1 到 i 的操作之后,相当于对一个数组进行怎样的变换。
对于每组 x y,找到数组 b[],它在经过前 x-1 个操作之后得到初始数组(a[i] = i)。对 b 进行 1 到 y 的操作对应的变换就可以得到结果。

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

I. FQ 的气球

FQ 有 n 个气球,排成一排,顺次分别标号 1 到 n。FQ 要用 m 种颜色对它们染色,但是不希望有任何两个标号相邻的气球颜色是一样的。
聪明的 ZQ 马上意识到,FQ 一共有 m(m1)n1 种不同的染色方法。但是ZQ 发现有些方案颜色太繁杂,导致美观程度不足,为此 ZQ 给出了 k 个标号 a1,a2, a3, …, ak(1 ≤ ai ≤ n),并要求 FQ 给这 k 个标号对应的气球染的颜色是一样的。
于是现在 FQ 还有多少种染色方法?

k 个位置枚举颜色有 m 种;相邻两个标号中的颜色方案可以使用矩阵快速幂求解;a1 前和 ak 后的部分应该另行计算方法数目。
上述相乘即是答案,应该注意 k=0,m=1,有相邻标号等情况。

时间复杂度 O(klog(n))

J. 绝园的双矩阵

有两个长 n 的数组 a[1..n]和 b[1..n],对这个两个数组进行两种操作。为了描述方便,我们先定义一个函数 f(n)。f(n)返回 n 模 232
1. 给出一对区间边界 x, y(1 ≤ x ≤ y ≤ n),和四个参数 p, q, r, s。对于每个 i (x ≤ i ≤ y),计算 tmpa = f(a[i] × p + b[i] × q); tmpb= f(a[i] × r + b[i] × s)。然后再使得 a[i] = tmpa; b[i] = tmpb。
2. 给出一对区间边界 x, y(1 ≤ x ≤ y ≤ n),询问 f(yi=x(a[i]×b[i])) 是多少。

使用线段树,每个叶子节点存一个向量 a2abb2 。这样区间查询可以使用和向量的第二元来回答。

对每个点的更新,可以看做左乘一个矩阵:

(pa+qb)2(pa+qb)(ra+sb)(ra+sb)2=p2prr22pqps+qr2rsq2qss2a2abb2

当然对于区间的修改,可以使用懒标记修改矩阵优化时间到 O(log(n))

时间复杂度是: O(n+mlog(n))

比赛中有队伍用分块通过了这道问题。分块的时间复杂度虽然是 O(mn) ,但是由于数据范围不大,估计运行只有 107.5 ,是可以很快通过的。

题目描述+标程+测试数据

http://download.csdn.net/download/ccnu_acm/9513829

本文作者

张静之

你可能感兴趣的:(2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解)