2025.4.10 模拟赛

4.10 模拟赛

没有状态的一场

全场只有我不会 T1/kk

感觉还是要静下心想下去,有时觉得“无关紧要”的优化可能就是正解。t1 一直卡就有点慌了,没有老老实实想正解。

snowmix

给定序列 \(\{a_n\}\in [1,n]\) ,求有多少个子区间满足:

  1. 值域连续
  2. 每个数 \(x\) 要么不出现,要么出现 \(x\)

做法似乎很多,大多“看起来复杂度不对”但是分析后复杂度正确。

F1:笛卡尔树上启发式询问

考虑到 \(t-s\le O(\sqrt n)\),于是枚举区间长度是 \(O(\sqrt n)\) 的。

建出笛卡尔树,固定最小值,然后在较小的子树枚举一个端点,再枚举长度,区间 hash 判断。

看起来复杂度 \(O(n \sqrt n \log n)\),实际上“根据主定理”可以去掉一个 \(\log\),另外枚举区间长度基本是不到 \(\sqrt n\) 的,于是能过。

F2:扫描线维护“可行区间”

前半段场上想到了,但没有仔细思考可行性,总“觉得不能过”,这是不好的/敲打

考虑到两个限制其实比较“独立”,而第二个限制非常严格,于是考虑没有第一个限制怎么做。

显然对每个数考虑,设 \(x\) 的出现位置为 \(p_1,p_2,\dots, p_k\) ,则对于 \(l\in (p_1,p_2]\) 的子区间,当且仅当 \(r\in (p_1,p_2) \cup [p_{x+1},p_{x+2})\) 时才能合法。

于是每个数都会带来一段区间的限制,一个右端点合法当且仅当满足了所有数的限制。

故线段树维护区间加,区间 max,maxcnt,扫描线即可。

再考虑值域连续的限制,发现满足上面要求的区间只有 \(O(n)\) 个,于是暴力找出这些区间, RMQ check 区间长度即可。

至于为什么只有 \(O(n)\) 个,首先感受上个数不会很多(因为限制严格),另外考虑从小到大加入每个数,会产生的新区间大概是 \(O(cnt_x)\) 的,于是总体是 \(O(n)\) 的。

starlight

神秘计数题

45 pts 的 dp + 式子是容易的

70 pts 大概是多项式优化 dp

满分是推式子。

  1. \(k\leftarrow n-k\) ,计数恰好 \(n-k\) 次 2 操作的方案数。
  2. 套个容斥,钦定 \(x\) 次 2 操作 $ ANS=\sum\limits_{x=k}{n/2}(-1)F(x)$
  3. 随机选合法操作 \(\Leftrightarrow\) 随机操作序列,不合法就跳过。
  4. 完全图钦定 \(x\) 条边比相邻边先选 \(\to\) DAG 拓扑序计数
  5. 对这 \(x\) 条边钦定顺序,其他边挂在更严格的限制上,于是 DAG 变成了外向树,拓扑序计数是容易的。

一番推理之后得到 \(F(x)={n\choose 2x}(2x-1)!!\cdot\frac{(2n-3-2x)!!}{(2n-3)!!}\)

于是 \(O(n)\) 预处理阶乘和双阶乘即可。

cosmodynamics

神秘大型分讨 + 码力题

key:笛卡尔树

因为对矩形高度的限制是区间 \(\min h_i\),于是考虑笛卡尔树支配区间是自然的。

\(k=1\)

直接枚举每个点的支配区间算就好,同时可以发现答案一定是 \(k\) 个点的矩形并,直接枚举即可通过 \(n\le 500\)

\(k=2\)

有两种情况:左右 / 上下

左右无交可以直接维护两个数组 \(f_i,g_i\) 表示 \(i\) 左边/右边的最大矩形,答案是 \(\max f_i+g_i\)

上下的在笛卡尔树上是祖孙关系,不妨 \(u\)\(v\) 的祖先,答案是 \(h_ulen_u+h_vlen_v-h_ulen_v\),后半部分是关于 \(h_u\) 的一次函数,于是李超树合并维护 \((-len_v,h_vlen_v)\) 即可。

\(k=3\)

有 5 种情况:

  • 左中右
  • 左1右2 / 左2右1
  • 上中下
  • 下1上2

第 1 种 \(f_{i,1/2/3}\) dp 即可。
大概是 \(f_{i,j}\leftarrow f_{i-1,j},f_{i,j}\leftarrow f_{l_u,j-1}+h_ulen_u\)

第 2/3 种和 \(k=2\) 一样,李超树合并更新 \(f'_i,g'_i\) 表示 \(i\) 左边/右边有两个矩形的最大值。
答案是 \(\max{f_i+g'i,f'_i+g_i}\)

第 4 种也是差不多的,令 \(G_u\)\(u\) 和一个儿子矩形并最大值,\(H_u\) 为金字塔答案,则 \(H_u=\max len_uh_u+G_v-len_vh_u\),同样可以用李超树维护。

第 5 种最复杂。

首先 \(S=h_ulen_u+h_vlen_v+h_wlen_w-(len_v+len_w)h_u\),发现如果不对 \(u\) 做限制,\(S\) 一定不大于实际的面积并,所以这样算没问题,但 \(v,w\) 不交的限制不能去掉。

假如真的可以去掉 \(v,w\) 不交的限制,那么后半部分仍然是关于 \(h_u\) 的一次函数。
\(A=\{(-len_i,len_ih_i)\}\),那么 \(A*A\)(闵可夫斯基和)就是 \(\{-len_i-len_j,len_ih_i+len_jh_j\}\),这个凸包可以 \(O(n)\) 到 $ O(n\log n)$ 求。

加入 \(v,w\) 不交的限制相当于要求 \(r_v < l_w\),那么在线段树上一定存在一个位置把 \(r_v\)\(l_w\) 分开。

考虑在线段树每个节点维护两个凸包 \(L,R\)。对于每个 \(v\),在 \(r_v\) 所有祖先的 \(L\) 凸包加入 \(v\),在 \(l_v\) 所有祖先的 \(R\) 凸包加入 \(v\),求每个节点的 \(L*R\) 就能保证 \(r_v\)\(l_w\) 恰好在这个节点向下递归时被分开。

实现精细一些,整体复杂度 \(O(n\log n)\)

posted @ 2025-04-12 09:42  Cindy_Li  阅读(25)  评论(0)    收藏  举报