欢迎光临散文网 会员登陆 & 注册

复盘|第341场周赛

2023-04-17 17:25 作者:UCLmsc  | 我要投稿

一最多的行

【遍历】找最多1,而矩阵只包含01,即求和最大的行。遍历每一行,统计一整行的元素和的最大值及其下标。由于是从上到下遍历行的,所以找到的最大值下标是最小的。

找出可整除性得分最大的整数

【暴力枚举】遍历每个divisors[i],统计它能被几个nums[j]整除。出现次数相等时,保存最小的divisor。

构造有效字符串的最少插入数

【贪心】用一个i指针遍历字符串,分类讨论,如果是“abc"就移3格,是”ab“、"ac"、"bc"就移2格,其余情况移1格。

【贪心】最终需要一个"abc"的周期字符串,设“abc"的周期为t,需要插入的字符数=3×t-len(word)。如何求周期——如果后一个字符大于前一个字符,说明需要新增一个周期,t+=1。

【数学】对于两个相邻字母a和b(a在b左边),使word有效需要插入ord(b) - ord(a) - 1个字母(比如"ac"需要补一个"b","ca"不需要补)。防止负数,写成(ord(b) - ord(a) - 1 + 3) mod 3。

最小化旅行的价格总和

【DFS】数据范围较小,对每个trips[i]跑一遍dfs,把从start到end路径上点x的经过次数cnt[x]都加1。计算每个点被经过的次数,更新price[i]为price[i]×cnt[i],问题变为计算减半后的price[i]之和的最小值。从任意节点出发DFS(如节点0),对于节点x和其儿子y,分类讨论:price[x]不变,那么price[y] 可以减半或不变,取最小值;如果price[x]减半,price[y]只能不变。因此子树x需要返回两个值:price[x]不变时子树x的最小价值总和,price[x]减半时的子树 x 的最小价值总和。

【Tarjan 离线 LCA + 树上差分】利用树上差分打标记,再通过一次 DFS 算出 cnt值。从x = start到y=end的路径可以视为从x向上到某个点“拐弯”,再向下到达y,这个拐点就是x和y的LCA。把路径视为x-lca'-lca-y,其中lca'是lca的儿子,由于更新的是点,拆分成x-lca'和y-lca,那么自底向上更新差分diff值,对于x-lca',更新diff[x]+=1,diff[lca] -= 1,对于y-lca,更新diff[y]+=1,diff[father[lca]] -=1。LCA可以用tarjan离线算法计算,再dfs,归的过程中累加diff,计算cnt。


复盘|第341场周赛的评论 (共 条)

分享到微博请遵守国家法律