Code
A - The Fair Nut and Elevator
B - Kvass and the Fair Nut
C - The Fair Nut and String
D - The Fair Nut and the Best Path
E - The Fair Nut and Strings
F - Max Mex
A - The Fair Nut and Elevator
简单猜想一下,可以知道电梯在一楼是最优的,后面直接统计即可
B - Kvass and the Fair Nut
因为我们要使最小的最大,因此肯定是所有数越平均越好
求出总和,减去需要花费的,然后剩下的除以nnn (下取整)
当然,因为初始不相同的原因,我们还要提前找到所有数中最小的
最后对结果取个minminmin即可
C - The Fair Nut and String
当b出现时,后面每出现一个a都能与前面所有的合法的序列组成一个新的序列
因此每次b出现时,更新增量,a出现时更新答案
D - The Fair Nut and the Best Path
不用考虑中途没油的情况,如果中途没油,那么前面这段肯定不用选,因为少掉这段答案肯定会增加
因此题目变成了求选路径,使得所选点权-所选边权最大
类似求树的直径,树形DP即可(有一次DFS做法,笔者用了两次,笔者代码实现较丑,不建议参考)
E - The Fair Nut and Strings
考虑对这kkk个字符串建一个TrieTrieTrie树,答案则是这棵树的节点个数
因此我们要最大化每层点的个数
对于第iii层
对于字符串A的第iii个字符aaa,如果a==′b′a == 'b'a==′b′ 说明如果前面全部最大的哪条路径的现节点不能选aaa,因此数量需要减111
字符串B同理
然后下一层的节点为当前层节点数量乘2,接着继续考虑下一位字符
因为只有kkk个字符串,因此每层节点最多只有kkk个
F - Max Mex
代码参考 xyz32768
线段树维护图上信息
线段树上每个节点维护[l,r][l,r][l,r]这些点权是否在一条路径上 ,如果在则节点储存该路径左端点右端点信息即可
合并时对于子节点上两条路径444个点进行判断即可,如果
dis(x,y)+dis(y,z)==dis(x,z)dis(x,y) + dis(y,z) == dis(x,z)dis(x,y)+dis(y,z)==dis(x,z) 或
dis(x,z)+dis(y,z)==dis(x,y)dis(x,z) + dis(y,z) == dis(x,y)dis(x,z)+dis(y,z)==dis(x,y)或
dis(x,y)+dis(x,z)==dis(y,z)dis(x,y) + dis(x,z) == dis(y,z)dis(x,y)+dis(x,z)==dis(y,z)或
则说333点在一条路径上,每次合并时做两次判断即可
Read More ~
标签:#
比赛