3月20日模拟赛 题解

时间:2023-03-21
本文章向大家介绍3月20日模拟赛 题解,主要内容包括A 字符串(string)、B 序列(sequence)、C 旅行者(travel)、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

3月20日模拟赛 题解

A 字符串(string)

link

引理:\(x\) 个人分 \(y\) 个苹果,可以有人不取,方案为 \(C_{y+x-1}^{x-1}\)

本题中考虑每个字符串的贡献。假设一段可延展的空间为 \(l\),那么结果就是 \(C_{l+K-1}^{K-1}\),左右贡献相乘就是这个字符串的贡献。

我们在考虑每个字符串的 \(0\) 为偏序,假设 \(s_i\) 是括号前缀和($\texttt ( $ 为 \(1\)\(\texttt )\)\(-1\))那么不难发现修改肯定是改前面一段的所有 \(\texttt )\) 和后面一段的所有 \(\texttt (\),说人话就是对于 \(s[l,r]\),他的 \(0\) 位偏序为:

\[2\max_{l-1\leq i\leq r}s_i-s_r-s_{l-1} \]

对这个式子拆开分别求和即可。单调栈维护一下。

时间复杂度 \(O(n)\)。DRC 有 \(O(n\log n)\)\(\texttt{cdq}\) 做法,不过我不太会。

B 序列(sequence)

link

很显然当 \(m=0\) 时是个很 经典的问题,这个问题的解法见我的 题解

我们考虑修改。考虑 \(m=0\) 的时候维护的单调栈,我们要在任意地方查询肯定要用到可持久化单调栈(其实用主席树维护)。但是这样子修改对后面会产生较大的影响。由于从前、后扫出来的结果是一样的,所以我们可以维护两个单调栈:从前扫的时候,从后扫的时候的单调栈。

引理:只有在原来单调栈 \(st[1,x-1],st[x+1,n]\) 里的划分点在新数列当中可能作为划分点。

证明:因为从左右扫的结果是一样的。而每次加入元素的影响最多是合并前面的段,得证。

我们观察每次改变 \(x\) 所带来的改变:

很显然是把 \(st[1,x-1]\) 的一段后缀和 \(st[x+1,n]\) 的一段前缀合并了。我们尝试更进一步的探索性质。枚举前面合并段数 \(k\),那么对后面来说肯定是合并越少越好,我们可以在线段树上二分位置。我们最后再来看合并出来的段和他的前驱的大小相比,如果小了说明不合法,大了说明可能合并多了。

不难发现 \(k\) 也是可以二分的,复杂度降至 \(O(n\log^2n)\)。足已通过。

虽然实现起来不是很好写就对了。

C 旅行者(travel)

link

显然记录最短路和次短路跑 \(\texttt{dijkstra}\) 即可。时间复杂度 \(O(T n\log n)\)

尽管还有 \(O(Tn\log^2n)\)\(\text{edu}\) 做法,但我觉得没啥用。

原文地址:https://www.cnblogs.com/KawaiiOU/p/17238543.html