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\):
这样验证即可.
正确性?不会证.
运算
对于矩阵的行列式,可以在 \(O(n^3)\) 复杂度内,使用类高斯消元计算出.
我们需要将矩阵消成上三角矩阵,行列式就是对角线乘积.
我们可以先观察最简单的矩阵,考虑 \(2^3\):
消成上三角矩阵为:
我们有如下消除方法:
用第 \(n\) 行减去第 \(n-1\) 行,用第 \(n-1\) 行减去第 \(n-2\) 行,……,用第 \(2\) 行减去第 \(1\) 行.
这样是不会改变行列式而得到最终矩阵.
观察发现,此时的对角线为:
因此行列式就是:
现在考虑更加复杂一些的情况:\(n=a^2b\),我们可以构造这样的矩阵:
将因数这样排列:\(1,a,a^2,b,ab,a^2b\),即看成两组:\((1,a,a^2),b(1,a,a^2)\),这样具有递归性质.
如何证明这样交换不会使行列式改变(即证明交换次数是偶数)?
考虑行列各会交换一次,因此是偶数次.
我们将上面的左上角 \(3\times 3\) 的矩阵看作一个单位,则有:
考虑将外层先消掉,之后消去内层.
通过一定的推导与扩展,我们可以得到如下式子:
对指数使用前后缀积即可做到 \(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\).
考虑贡献系数:- 选择 \(k-(j+1)\) 个位置,\(\binom{c_1-j}{k-j-1}\).
- 决策 \(h_i\) 的高度,总共有 \(2(k-j)\) 种,用掉 \(k-(j+1)\),剩下 \(k-j+1\) 个.
- 考虑未确定的 \(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\):
时间复杂度是 \(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)\).

浙公网安备 33010602011771号