2025-01-06「AHOI#HNOI 2017」(Partial)
2025-01-06「AHOI#HNOI 2017」(Partial)
A 单旋
知识点
线段树,set。
分析
发现题目只要求单旋最大值和最小值,然后我们可以模拟一下,那么我们以最小值为例。
-
插入一个值:
它的父节点就是它的前驱后继(没有就不用算在内)中深度较大的那个,连接上即可。
-
单旋最小值:
- 它的右子树:会接到父节点上,深度不变。
- 不在它子树内的点:深度加一。
- 自己:变为根。
然后它自己、它的父节点、右子节点和根的一些连接关系需要改变。
-
再看单旋删除最小值:
- 先进行单旋最小值,然后把根节点删除,再让其他结点深度全部减一。
再把自己和根节点的连接关系处理一下即可。
那么我们发现其实我们只要维护好连接关系,然后就可以用区间操作来维护全树所有的深度。
可以用 set 配合树状数组实现,也可以用线段树。
B 影魔
知识点
扫描线,线段树,树状数组。
分析
我们尝试枚举一个数作为点对 \((i,j)\) 中间的最大值,那么用单调栈处理出每个点左、右第一个比它大的点,分别记为 \(L_i,R_i\)。
此时我们就可以得到三种有贡献的点对:
- \((L_i,R_i)\),权值为 \(p_1\);
- \((l,R_i-1),l \in (L_i,i)\),权值为 \(p_2\);
- \((L_i+1,r),r \in (i,R_i)\),权值为 \(p_2\)。
那么就变成一个二维平面上统计带权面积和,用带区间修改与查询操作的数据结构来做即可。
C 礼物
知识点
FFT,NTT。
分析
假设更改的长度为 \(d\),那么式子变为:
\[\begin{aligned}
\sum (x_i + d - y_i)^2
& = \sum (x_i^2 + y_i^2 + d^2 + 2dx_i - 2dy_i - 2x_iy_i) \\
& = n d^2 + \sum(2x_i - 2y_i) d + \sum(x_i^2 + y_i^2) - 2 \sum x_i y_i \\
\end{aligned}
\]
变成两个互不干扰的部分:\(n d^2 + \sum(2x_i - 2y_i) d + \sum(x_i^2 + y_i^2)\) 和 \(-2 \sum x_i y_i\),前一个是关于 \(d\) 的一元二次函数,后面则是一个卷积。
反思
- 做第一题花了太长时间,而且用到的思路过于复杂,中途应该停下来思考一下。
- 第二题没有把模型建出来,也没有把套路拿出来用。
- 最后一题没时间来推式子,但其实很简单。

浙公网安备 33010602011771号