2025.5.28 模拟赛

5.28 模拟赛

100+30(50?)+48=178, rk 43/86

省流:中位数大师

遗失 - lose

贪心签到题,很快就想到结论,写了个暴力验证,不到 1h AC。

key1:条件等价于最大化字典序
key2:左括号被 \(1,3,5,7,\dots\) 偏序

容易推出,如果一个空位的后面是右括号,则必须填左括号。

序列可以划分成形如 (_)_)_)_ 的若干段,一个合法区间形如若干整块 + 一个散块。于是可以分别计算每段的贡献,简单推一下容易线性求出。

次回予告 - preview

经过一番讨论,可以得出结论:
对于 \(n>3\):

  • \(2max\ge sum\)\(ans=sum-max-n+2\)
  • 否则,\(ans=sum-n+1\)

对于 \(n=3\) 有一些情况需要讨论(比如会出现形如 2 1 1 的东西)。

不妨先认为所有区间都符合第二种情况,计算第一种情况的 \(\sum max-1\)

统计这个东西显然想到笛卡尔树,枚举较小的一边,二分另一个端点,于是得到 \(O(n\log n)\) 个形如 \((r,x,y,w)\) 的限制,表示右端点为 \(r\),左端点属于 \([x,y]\) 的区间,都要加上 \(w\)(左边同理)。

\(f(l,r)\) 的矩阵画出来,上述操作相当于是一行/一列的区间加,查询是一个 \((l,l)-(r,r)\) 的矩阵和,显然可以扫描线 + 区间加区间查询线段树维护。

而且因为两维是对称的,所以可以一起做。

吃饭 - meal

神奇题目

起点不同,路径一定不同,于是独立。

考虑只有一个起点,每次选取一个增量最大的路径加进去。注意到,选取了最长链之后,接下来的选择形如长链剖分,能增加贡献的只有“分叉”后的路径(一段后缀)。

考虑计算每个点的贡献。
我们一定是按照最长链从大到小的顺序选择有贡献的链,也就是按照某种拓扑序遍历。
一个点能贡献的权值分为两部分,一部分是从这个点开始的有贡献链,一部分是经过这个点的有贡献链。前一部分要占据 \(k\) 条路径的限制。
注意到,能从一个点开始的有贡献链数量,等于到达这个点的路径数量。从这个点开始的有贡献链,就是它的最长链。
直接递推即可。

复杂度 \(O(m+n\log n)\)

posted @ 2025-05-28 20:45  Cindy_Li  阅读(16)  评论(0)    收藏  举报