山大校赛 2024 决赛 ABCDGHIJ 题解(其余题目仍在更新)

回文子串

https://ac.nowcoder.com/acm/contest/98505/A

山大校赛 2024 决赛 ABCDGHIJ 题解

因为太菜,暂时没有 L,且 EFK 还在更新,此三题预计在一周内更完。

  • 2024.12.17:感冒并在学校硬抗了六节课之后扛不住了,请假回家并更新了 G 题和各题的自评难度。

花絮

这位可爱的初四小朋友继赛前一周 NOIP 失利(本来就只有 然后挂了一个点到 结果全省 出头变成 )后又在本次比赛中的 I 题发现了关键性质后瞪了一个点愣是没转化出来,喜提六题 rk7 遗憾离场。本人赛时成绩插入大一组是 rk2,大二以上组只有 rk11,校内(在很多高年级神犇都没来的前提下)只有 rk3,还是太菜了。

本题解按照我自认为的题目难度排序。

B

自评难度:红。

大纲(本人做法):

  • 【1】初中代数(J)
  • 【3】整除(J)

每次循环先扣 点血量,再涨 点架势条,即血量共需要 回合打完,架势条共需要 回合打完,取最小值即可。复杂度 每组。

J

自评难度:下位蓝。

大纲(本人做法):

  • 【8】分块(NOI)

赛时想抢一血然后看这题挺可爱的就开了于是喜提两发不管怎么说最后还是一血上了。

这种乍一看不怎么好上数据结构而数据范围又只有 级别的东西容易想到分块。于是每 (本人为了防止炸掉给它加了 )个元素分一个块,每个块维护一个 tag 记录操作一,接着一旦出现操作二就把操作位置所在块的 tag 进行下传后暴力修改即可。注意两点:

  • 同一个块内连续(中间没有操作二)打 tag 时保留最大值,别直接覆盖了。
  • 跑完之后把所有块再下传一遍。

复杂度

C

自评难度:黄~下位绿。

大纲(本人做法):

  • 【4】二分法(J)

求最值题,找单调性,发现有,于是直接二分答案,check 函数内模拟即可,注意当 时剩的全是小 的就不要再跑了。复杂度 ,其中 是一个可以接受的常数。

I

自评难度:上位绿~下位蓝。

大纲(本人做法):

  • 【9】置换群与循环群(NOI)(估计只有这一个了?)

看到这个题很难不去想交换两个数之后置换环的变化。画出图来可知任意两元素交换,则原来同环变不同环,不同环变同环。但答案需要的是环的个数的奇偶性,所以进行转化,结论变为每次交换都会改变奇偶性(但是我赛时居然一个小时也没得到……),于是预处理出原排列中置换环的个数然后每次询问时算出操作了多少次再套刚才那个结论就做完了。预处理 ,单次询问

A

自评难度:中位绿~上位绿。

大纲(本人做法):

  • 【1】枚举法(J)
  • 【5】桶排序(S)(非必要,可以优化复杂度和码量)

大纲没有拆贡献的相关思想,差评。

数据范围这么大直接算肯定是很难的,而且方案也不好构造。因此只能考虑拆贡献。

对于每个字符都可以让它和其余所有的同字符之间产生对称轴,因此子串的个数就是此时该字符的个数(包含自身,因为长度为 的也算)。每次暴力枚举或者开桶维护都可以,复杂度分别为

H

自评难度:中位蓝。

大纲(本人做法):

  • 【4】简单一维动态规划(J)

暴力枚举三个字符是 的,无法接受。于是考虑优化。

首先可以后缀和维护一下每个字符后面有多少个 R/G/B/*,复杂度降至 。接着对着刚才求出的后缀和再来一遍后缀和计算每个字符后面 RB/R*/*B/BG/B*/*G/GR/G*/R*/** 的数量,这里式子项数略多所以建议是不要把 *R/G/B 合并,单独计算的话比较清晰,且不容易算重。然后根据题意列式子统计答案即可。时间复杂度 ,常数比较大。

D

自评难度:上位绿~下位蓝。

大纲(本人做法):

  • 【2】乘法原理(J)
  • 【4】动态规划的基本思路(J)(因为不是一维的,参考 CSP-J2023 第二轮分析报告的处理方式进行标记,报告中建议难度为
  • 【8】动态规划的常用优化(S)

有点像 NOIP T2。

输赢的性质有点麻烦,先考虑不限制输赢怎么做。

看到数据范围想到 DP。对于我这种蒟蒻来说一个比较容易想到的暴力 DP 是设 为进行到第 回合,小 Z 的最小值为 ,小 W 的最小值为 的方案数。但是这样可以转移的情况很多(因为我们也不知道全局次小、第三小等等都在谁家里)导致复杂度达到了

列出转移方程后可以发现我们其实只需要 里较小的那个即全局最小值,因此状态改为 为第 回合全局最小值为 的方案数,转移类似于刚才,下一个 可能取 中的任意值。

接着考虑固定输赢的限制。首先大胆猜想没啥限制,因为似乎可以通过交换两边对应位置角色的方式来改变输赢。但是跑不过样例。于是找原因。打表之后发现是因为交换后小 W 将可能不会在那一回合使用那个角色因为它更大/更小了。因此考虑在限制下到底能往哪些方向转移。我们发现我们刚才猜想没啥限制的原因在连续的 Z 胜或 W 胜中仍然有效(因为此时根本不需要换),于是考虑 ZW 交替的地方。假设第 回合胜方由 Z 变为 W,则在某一回合要求 Z 拿最小值而下一回合换 W 拿最小值,分讨一下各种情况发现此时 W 应该只能拿 ,Z 拿 ,所以说交替处没有额外贡献,对每个连续段跑刚才的 DP 并乘起来即可。复杂度

G

自评难度:中位紫~上位紫。

大纲(本人教练做法):

  • 【6】最小生成树:Kruskal 算法(S)
  • 【7】笛卡尔树(S)
  • 【6】树的重心、直径、DFS 序与欧拉序(S)
  • 【6】树上差分、子树和与倍增(S)
  • 【6】最近公共祖先(S)
  • 【6】线段树(S)
  • 【8】离线处理思想(NOI)

听说存在使用虚树的 做法但显然我是不可能会那种十级算法的。 有会的大佬欢迎补充。

重点前置在线段树和 Kruskal 重构树。


补这题给我补爽了。

首先介绍下 Kruskal 重构树的思想。(会的直接看下一段即可)

考虑这样一个问题:给定一张无向图,多次询问求两点间最小瓶颈。

  • 首先考虑暴力做法。我们进行优先队列 BFS,状态就是到达了哪个点以及到达这个点的瓶颈,每次找瓶颈最小的状态扩展。
  • 考虑优化。发现这个过程很像我们 Kruskal 算法的每次取最小边,进而发现两点间的最小瓶颈就是使它们第一次出现在同一个并查集内的那条边。
  • 发现合并两个并查集的过程就是合并两个区间,进而建出类似于线段树的树形结构,每个节点处记录一个点集和连接两个儿子点集的边的长度。这样这棵树的叶子就是每个节点,而我们要找的最小瓶颈就是这两个节点之间的 LCA。这棵树就叫做 Kruskal 重构树

于是多次询问求最小瓶颈就是 Kruskal 重构树的经典应用。

于是我们发现:题目中的“瓶颈恰好为 的路径”和刚才那个玩意很像,于是把思路往 Kruskal 重构树上靠。于是根据 的值分为三类:

  • 小于 间的最小瓶颈,此时明显没有合法的路径,直接输出
  • 等于 间的最小瓶颈,此时明显重构树上路径最优;
  • 大于 间的最小瓶颈:先判是否存在长度为 的边,如果存在的话,可以贪心地想到对于一条从 的长度为 的边, 经过它的最优路线为(如图):
    • 走树上路径;
    • 走长为 的边;
    • 走树上路径。
    • 然后对着所有长度为 的边做一遍,你就会发现:

复杂度是错的。显然数据只要所有边全设成 然后对着 疯狂询问就趋势了。所以考虑优化。根据刚才的 hack 我们希望优化的方向就是将所有长度相同的边一块处理。

由于我们希望找到 到所有 及所有 的最小瓶颈,所以我们考虑将所有的长度为 的边都标记到重构树上,也就是我们希望在树上找一个深度不超过 的尽可能深的点,满足至少存在一个长度为 的边 使得 在以该点为根的子树中。

容易想到外层二分一下深度,此时需要快速的子树询问,想到 DFS 序,以 DFS 序为下标用线段树维护整棵重构树,对于每种瓶颈长度的询问,在处理之前将所有这种长度的边的 LCA 都标记为 ,这样求子树内是否完整包含一条长为 的边就转化为了线段树区间求和,因为一共就不超过 条边,所以最终的复杂度在 级别。

全部评论
G题分情况讨论,第一,s和t的路径上只有一条b边,那么我考虑枚举每条边权值为b的边,然后两端和st的连通性。第二s和t路径上会有多条b边,那么我考虑所有权值为b的边会形成若干个连通块,我要在每个连通块里判断s和t能不能靠小于b的边连到同一个连通块里。这里用带权并查集进行判断,以及按秩合并(小的插到大的里面)来保证单log的复杂度。并查集构建过程种,从小到大的遍历边就可以。
点赞 回复 分享
发布于 2024-12-18 13:44 山东

相关推荐

有很多问题,求大佬们解答,谢谢大佬们:不知道现在该怎么投实习,该怎么准备内心很纠结学校课程和实习到底怎么选择, 自己也不想课程学业这边出问题, 是不是只能投暑期实习,具体时间该怎么安排前端面试也需要准备算法么, 自己的算法能力很薄弱, 面试题需要准备到什么程度?没有ai项目经验的话,我该如何去补充,如何去找好的ai项目
smile丶snow:1.简历尽量一页,比如教育经历那里,全日制,计算机学院这些可以去掉没啥用好浪费空间。 熟悉三件套就没必要写了吧。js基本上是这样写 * JavaScript核心:深入理解 JS 运行机制(事件循环 Event Loop、微任务/宏任务),熟练掌握 Promise/Async 异步编程 模型。 熟悉可以改成熟练掌握。组件库写一个ant感觉就行,多写了浪费空间。 旅游项目是不是jonas的natours啊,我之前简历也有这个。我之前是这样写的 全栈思维: 熟悉 Node.js/Express 后端架构,掌握 MongoDB 数据库设计与聚合查询 工程化我觉得还是少些吧,不写就问的少,如果你真的了解的话可以写。 1.实习的话推荐大厂官网和aoob上面投,我自己有写一个校招网站的小网站可以直达~github主页上面有,顺便求个关注( 2.大三下一般课程比较少了吧,如果学校比较严的话可以多沉淀一会,如果不太严可以请dai课然后去实习,尽量找个近一些的就行。暑期实习不是暑假才实习哦,基本是上3月底4月初发offer就可以过去了,然后大概暑假的时候走转正流程答辩。 3.大厂算法题+js手写体。hot100+常见的比如数组转树,Promise.all,deepClone,之类 js手写都不难其实。算法看自己能力吧,我其实算法能力也不行。 4.自己平时没有用AI Coding吗?自己想一下怎么让AI帮你更好的写代码~比如Skill的诞生,OpenSpec的诞生,不都是我们想让AI更好帮我们写代码吗。
我的实习日记
点赞 评论 收藏
分享
03-24 13:24
已编辑
江西农业大学 后端工程师
最近或许大家都听说xxxx厂裁员,无论前端,后端,大数据,测试,运维,人人可危, “前端死了,后端也死了,JAVA崩盘了,你们这群搞大模型的真是码奸”这次AI真的会让我们无路可走吗????????太阳底下已经没有新鲜事了旧的生产力的消失,必然有新的生产力诞生马车夫消失 → 汽车司机、修车工、石油工业诞生,从业人数是马车夫的百倍手工纺织女工消失 → 纺织机械工程师、面料设计师诞生,纺织品产量提升百倍2007年苹果开放 App Store,"移动端开发者"这个职业压根不存在。八年后,全球应用经济规模突破 1000亿美元,凭空诞生了数百万开发者岗位。每一次"这次真的完了...
二十岁的编程男神王大...:那这个时代是什么时代呢? 是全员agent的时代,是前端+AI,后端+AI的时代,AI已经融入了项目生命周期的的每一个角落,那我最近在做的东西举例,检查BUG时,我们会用codex,CC等工具的skill去check,效果好还能直接fix,测试的时候,apifox等工具已经有了AI落地的改造,CI/CD阶段,我们会根据hook去跑AI check脚本,就连不少中间件,也迎来了AI落地的改造,(AI网关,AI在MQ中的运用),都可以去了解下 另外记着,这些东西不是意义,工作只是谋生的一个手段,ai是让开发提效了,但是呢,原先一周的工作流程压缩到了两天内,同时低级的都裁员了,只有高级的去维护,你看似写的大义凛然,或许那天你也会成为你文章里面拒绝往前走的人,你才大二,面对技术有热情是对的
AI求职实录
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务