2025-01-06「AHOI#HNOI 2017」(Partial)

2025-01-06「AHOI#HNOI 2017」(Partial)


A 单旋

知识点

线段树,set

分析

发现题目只要求单旋最大值和最小值,然后我们可以模拟一下,那么我们以最小值为例。

  1. 插入一个值:

    它的父节点就是它的前驱后继(没有就不用算在内)中深度较大的那个,连接上即可。

  2. 单旋最小值:

    • 它的右子树:会接到父节点上,深度不变。
    • 不在它子树内的点:深度加一。
    • 自己:变为根。

    然后它自己、它的父节点、右子节点和根的一些连接关系需要改变。

  3. 再看单旋删除最小值:

    • 先进行单旋最小值,然后把根节点删除,再让其他结点深度全部减一。

    再把自己和根节点的连接关系处理一下即可。

那么我们发现其实我们只要维护好连接关系,然后就可以用区间操作来维护全树所有的深度。

可以用 set 配合树状数组实现,也可以用线段树。


B 影魔

知识点

扫描线,线段树,树状数组。

分析

我们尝试枚举一个数作为点对 \((i,j)\) 中间的最大值,那么用单调栈处理出每个点左、右第一个比它大的点,分别记为 \(L_i,R_i\)

此时我们就可以得到三种有贡献的点对:

  1. \((L_i,R_i)\),权值为 \(p_1\)
  2. \((l,R_i-1),l \in (L_i,i)\),权值为 \(p_2\)
  3. \((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\) 的一元二次函数,后面则是一个卷积。


反思

  1. 做第一题花了太长时间,而且用到的思路过于复杂,中途应该停下来思考一下。
  2. 第二题没有把模型建出来,也没有把套路拿出来用。
  3. 最后一题没时间来推式子,但其实很简单。
posted @ 2025-01-06 15:56  Add_Catalyst  阅读(13)  评论(0)    收藏  举报