目录
5.13-区间的连续段—前缀和+倍增
预处理前缀和作倍增,并用前缀和计算哪些点值是超过K,选中即无解。倍增静态记录某个位置分2^x段的最远位置,对于每次查询,从L开始按倍增存储的最大可分段长度向后处理至R,答案为倍增次数+1。
5.12-Birthday Cake—KMP/字符串哈希
来源:第十一届山东省大学生程序设计竞赛(正式赛)——F Birthday Cake
用KMP算法获取每种字符串的最大真前后缀,对于当前字符串,枚举他不同位置上的最大真前后缀,在map中查找->(删去了前缀和后缀的中间子串)是否存在,并累计答案。
5.11-Matrix Problem—构造/思维
来源:第十一届山东省大学生程序设计竞赛(正式赛)——M Matrix Problem
构造两个01矩阵A,B,使这两个矩阵各位上取或(A|B)后的矩阵和给定的矩阵完全一样,额外要求构造的两个矩阵所有1连通。题目给出了突破点:给定矩阵的最外一圈是必定全0的,
那么取一对左右(或上下)外围,让最左一列A全1,B全0,最右一列A全0,B全1;然后奇数行A全1,B全0,偶数行A全0,B全1。此时的A和B中所有1是连通的,并且取或后的矩阵为全0,那么对给定矩阵处理,将1按所在位置分给A,B即可。
5.10-Cat Virus—构造/规律
来源:第十一届山东省大学生程序设计竞赛(正式赛)——C Cat Virus
构造出一棵节点可染成白色或黑色的树,当父节点染黑时它的所有子节点默认全部染黑,要求上色方法一共K种
根据染色要求可得:
1.若某节点为叶节点,它可以染黑也可以染白,那么在对方案数贡献上是乘法法则的2倍关系,
可得出规律:若当前节点所有兄弟节点总贡献方案数为m,这个节点会将方案数扩大为2m。
2.若某节点为非叶节点,它染白的时候,等效在计算子树的方案数,而在计算它的子树贡献上会算到一种子树全染黑的情况,进而这个点只有一个染黑的选择,
可得出规律:若当前节点子树总贡献方案数为m,这个节点会将方案数扩大为m+1。
上图是K=25的构造树演示,方案数是从叶节点往上加的,那么我们倒推,从根节点构造树点边的时候,加上对K的奇偶和是否大于2特判即可
5.9-食物链—带权并查集+向量偏移
来源:2021算法竞赛入门班第三节课堆栈队列等习题——食物链
5.8-蚯蚓—队列
初看为基于优先队列,比较繁琐的模拟,但是m的范围到了7*1e6,优先队列会TLE,
优先队列可以被队列优化掉,关键在于这个点:
对于两只蚯蚓a>b,若a被切后分成了a1,a2,b被切后分成了b1,b2。
假设a被切T秒后b才被切,那么b被切的时候(p为切断分数,q为每分钟增长数):
a1 = ap+tq,a2 = a(1-p)+tq,b1 = (b+tq)p,b2 = (b+tp)(1-q)
很明显,先被切的a哪段都要比b1,b2长,那么每次被切断的两只蚯蚓只需放到普通队列尾即可,省去了优先队列
ps:为了方便处理,开三个队列,1存初始蚯蚓,2存每次切断后较长的一段,3存较短的一段,三个队列都有两个指针,分别表示该队列总长度len和当前已使用长度use。
5.7-C. Nastia and a Hidden Permutation—思维(交互题)
来源: Codeforces Round #720 (Div. 2)-C. Nastia and a Hidden Permutation
简化两种查询可得:
——查询1在x取n-1时:return max(min(n-1,pi),min(n,pj))
即只有当pj为n时返回n,若返回值为n-1,pi可能为n,可通过交换i,j再次查询验证pi是否为n。
——查询2在x取1时:return min(max(1,pi),max(2,pj))
即只有当pi为1时返回1,若返回值为2,pj可能为1,可通过交换i,j再次查询验证pj是否为1。
通过题目中给的条件,因查询次数不能超过⌊n*3/2⌋+30,可以用n/2次查询1得出序列最大值n所在位置,然后对剩余n-1个数使用查询2,并使查询2的pj恒为最大值,即查询2将返回的就是其余n-1个数的具体值,预计需要n/2+n-1次,加上在查出最大值过程中的额外消耗,可满足题意。
5.6-F1/F2. Guess the K-th Zero(Hard version)—二分+分块(交互题)
来源:Codeforces Round #719 (Div. 3)-F. Guess the K-th Zero
简单版二分即可,困难版提前计算分块的前缀和,每次在固定的一个或几个块内查询,查询完更新前缀和即可,大大提高多次查询和修改的效率
F1:
F2:
5.5-A. Boredom—DP
来源:Codeforces Round #260 (Div. 1)-A. Boredom
n个数字,每次选一个数a【k】删去,同时所有值为a【k】+1和a【k】-1的数都连带被删去,并获得价值a【k】。求把所有数字删去可获得的最大价值。
动态规划,对于整个序列,对值处理而不是序列元素处理,定义dp【i】为:删去数值1~i的所有数可获得的最大价值。对于数值i,要么直接删去,要么通过删去i-1间接删去。
注意:只要数值i存在并主动消除,那么所有i-1和i+1都连带消除,主动删去的价值转移为dp【i-2】+cnt【i】× i。