2026.8.22 模拟赛

https://oj.gxyzh.com/d/hzoj/contest/69b61213a8f4eb2d3dde9acf

这场是 47 组的题.

T1 T2 T3 T4
实际得分 20 0 0 60
期望得分 0 0 0 45
能力得分 100 0 0 60~100

T1 是神秘构造,T2 是一定的线性代数+神秘脑电波技巧,T3 是经典延迟钦定 DP,T4 是经典区间处理+线段树.

圆环

不妨钦定 \(a_1=m\),考虑如下构造:
若 \(a_i\ne 2^k\),则令 \(a_{i+1}=2^{\left \lceil \log_2 a_i \right \rceil }-a_i\).
这样 \(a_i>a_{i+1}\),最终会变成 \(2^k\).
我们将 \(a_i\) 对称到 \(a_1\) 的另一边,中间填上 \(2^k\) 即可.

举个例子,对于 \(m=41\):

\[41,23,9,7,1,1,1,\dots ,1,7,9,23,41 \]

这样验证即可.

正确性?不会证.

运算

对于矩阵的行列式,可以在 \(O(n^3)\) 复杂度内,使用类高斯消元计算出.
我们需要将矩阵消成上三角矩阵,行列式就是对角线乘积.

我们可以先观察最简单的矩阵,考虑 \(2^3\):

\[\begin{bmatrix} 1 & 1 & 1 & 1\\ 1 & 2 & 2 & 2\\ 1 & 2 & 4 & 4\\ 1 & 2 & 4 & 8 \end{bmatrix} \]

消成上三角矩阵为:

\[\begin{bmatrix} 1 & 1 & 1 & 1\\ 0 & 1 & 1 & 1\\ 0 & 0 & 2 & 2\\ 0 & 0 & 0 & 4 \end{bmatrix} \]

我们有如下消除方法:
用第 \(n\) 行减去第 \(n-1\) 行,用第 \(n-1\) 行减去第 \(n-2\) 行,……,用第 \(2\) 行减去第 \(1\) 行.
这样是不会改变行列式而得到最终矩阵.
观察发现,此时的对角线为:

\[1,(p-1),(p-1)p,(p-1)p^2,\dots \]

因此行列式就是:

\[(p-1)^kp^{\frac{k(k-1)}{2}} \]

现在考虑更加复杂一些的情况:\(n=a^2b\),我们可以构造这样的矩阵:
将因数这样排列:\(1,a,a^2,b,ab,a^2b\),即看成两组:\((1,a,a^2),b(1,a,a^2)\),这样具有递归性质.
如何证明这样交换不会使行列式改变(即证明交换次数是偶数)?
考虑行列各会交换一次,因此是偶数次.

\[\begin{bmatrix} 1 & 1 & 1 & 1 & 1 & 1\\ 1 & a & a & 1 & a & a\\ 1 & a & a^2 & 1 & a & a^2\\ 1 & 1 & 1 & b & b & b\\ 1 & a & a & b & ab & ab\\ 1 & a & a^2 & b & ab & a^2b \end{bmatrix} \]

我们将上面的左上角 \(3\times 3\) 的矩阵看作一个单位,则有:

\[\begin{bmatrix} 1 & 1\\ 1 & b \end{bmatrix} \]

考虑将外层先消掉,之后消去内层.

通过一定的推导与扩展,我们可以得到如下式子:

\[\prod_i ((p_i-1)^{a_i}p^{\frac{a_i(a_i-1)}{2}})^{\prod _{j\ne i} (a_j+1)} \]

对指数使用前后缀积即可做到 \(O(k)\) 计算.

石柱

对于一个初始的情况,现在考虑最后的情况:
从后往前考虑,对于 \(h_i\),若后面出现了 \(1\to h_i\),则这个位置会变成 \(0\),否则会变成 \(1\to h_i\) 中的 \(\operatorname{mex}\).

有了这个性质,我们可以从后向前进行 DP.
为了方便考虑,我们让每两个相同的值是不同的,最终除以 \(2^n\) 即可.
设 \(f_{i,j}\) 表示决策完第 \(i\) 个,出现了 \(1\to j\) 的方案数.

显然 \(f_{2n+1,0}=1\).
设 \(c_0\) 表示 \(i+1\) 及之后中,有多少个最终消失;
设 \(c_1\) 表示 \(i+1\) 及之后中,有多少个最终存在.

下面考虑 \(f_{i+1,j}\) 的转移:

  • 位置 \(i\) 最终会消失,这说明初始 \(i\) 的高度 \(h_i\le j\).
    总共有 \(2j\) 种值,其中 \(j\) 个出现过,同时前面的 \(c_0\) 个位置也会占用,因此剩下 \(j-c_0\).
    \(f_{i,j}\gets f_{i+1,j}\times (j-c_0)\).
  • 位置 \(i\) 不会消失,这说明初始 \(i\) 的高度 \(>j\).
    • 若 \(h_i>j+1\),这一部分不好考虑,于是延迟钦定.

    • 若 \(h_i=j+1\),但是由于后面会有没有决策的高度,考虑枚举加入 \(j+1\) 之后形成的连续高度 \(k\).
      考虑贡献系数:

      1. 选择 \(k-(j+1)\) 个位置,\(\binom{c_1-j}{k-j-1}\).
      2. 决策 \(h_i\) 的高度,总共有 \(2(k-j)\) 种,用掉 \(k-(j+1)\),剩下 \(k-j+1\) 个.
      3. 考虑未确定的 \(k-(j+1)\) 的高度形成过程,设为 \(g_{k-j-1}\).

      \(f_{i,k}\gets f_{i+1,j}\times \binom{c_1-j}{k-j-1}\times (k-j+1)\times g_{k-j-1}\)

现在考虑如何求解 \(g_n\):

\[g_n=\sum_{i=1}^n \binom{n-1}{i-1}\times (i+1)g_{i-1}\times g_{n-i} \]

时间复杂度是 \(O(n^3)\),精细卡范围可以得到优秀的常数.

村庄

考虑放到序列上考虑:
钦定一条边 \((u,v),u<v\),若区间 \((u,v)\) 中存在向区间外的连边,则说明会有交点,使用并查集维护联通块.
暴力时间复杂度为 \(O(nm)\).
其实不难发现贡献只有 \(m\) 个,使用 set 存储,可以得到 \(O(m^2)\).

一般遇到区间关系的题,有如下转化:
考虑区间的关系有三种:相离、相交、包含.
显然相离是必然存在的,我们要将相交转化成包含,或者反之.
这样只有两个种区间关系,会容易使用数据结构维护.

对于本题,设 \(a<b<c<d\),存在有 \((a,c),(b,d)\).
不妨令边为 \((a,b),(b,c),(c,d)\),即分解为若干互不相交的区间.

我们维护每个点上面的经过的边的数量(不包括端点)\(h_x\),考虑每次连边 \((u,v)\) 时这样处理.

  • 若 \(h_u\ne h_v\),不妨令 \(h_u>h_v\).
    找到 \(u\) 右侧第一个 \(<h_u\) 的位置 \(t\),这是线段的端点,将 \(u\) 与 \(t\) 所在联通块合并.
  • 若 \(h_u=h_v\),找到 \(u\) 右侧第一个 \(<h_u\) 的位置 \(t\).
    若 \(t<v\),则将 \(t\) 与 \(u\) 合并.
    若 \(t\ge v\),则将 \(u\) 与 \(v\) 合并.

上面寻找的过程可以使用线段树二分.
现在考虑如何合并两个联通块.

由于区间是互不相交的,因此联通块也是互不相交的.
若 \(r_x<l_y\),则将 \((r_x,l_y)\) 贡献添加.
若区间包含,则将 \([\max(l_x,l_y),\min(r_x,r_y)]\) 贡献减去.

可以使用线段树和并查集维护,时间复杂度为 \(O((n+m)\log n)\).

原题

  1. [THUPC 2026 初赛] 序列
  2. 无.
  3. [JOISC 2020] 最古の遺跡 3
  4. Building Forest Trails
posted @ 2026-08-22 21:28  Zhou_Lemon  阅读(28)  评论(2)    收藏  举报